Eu tenho um arquivo de texto que tem uma linha específica algo como
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Preciso substituir toda a linha acima por
This line is removed by the admin.
A palavra-chave de pesquisa é TEXT_TO_BE_REPLACED
Eu preciso escrever um script de shell para isso. Como posso conseguir isso usando sed
?
Respostas:
Você pode usar o comando change para substituir a linha inteira e o
-i
sinalizador para fazer as alterações no local. Por exemplo, usando o GNU sed:fonte
c\
quando seguido diretamente por uma variável:…c\$VAR…
a barra invertida escapará do dólar. Neste caso, eu (bash / sed no Ubuntu 15.10) tive que escrever #…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
; (quando o primeiro parâmetro está em branco edita no arquivo, caso contrário, cria um backup)Você precisa usar wildards (
.*
) antes e depois para substituir toda a linha:fonte
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
a opçãoA resposta aceita não funcionou para mim por vários motivos:
-i
com uma extensão de comprimento zeroc\
comando é estranha e eu não consegui fazê-lo funcionarEntão, aqui está a solução que eu achei que deveria funcionar para a maioria dos casos:
Portanto, o uso da amostra para corrigir o problema representava:
fonte
A resposta acima:
Funciona bem se a sequência / linha de substituição não for uma variável.
A questão é que, no Redhat 5, o
\
depois doc
escape o$
. O dobro\\
também não funcionou (pelo menos no Redhat 5).Por meio de tentativa e teste, descobri que o
\
após oc
é redundante se a sua linha / seqüência de caracteres de substituição for apenas uma única linha. Então eu não usei\
depois doc
, usei uma variável como uma única linha de substituição e foi uma alegria.O código seria algo como:
Observe o uso de aspas duplas em vez de aspas simples.
fonte
Todas as respostas fornecidas até o momento pressupõem que você saiba algo sobre o texto a ser substituído, o que faz sentido, pois foi o que o OP pediu. Estou fornecendo uma resposta que pressupõe que você não sabe nada sobre o texto a ser substituído e que pode haver uma linha separada no arquivo com o mesmo conteúdo ou conteúdo semelhante que você não deseja que seja substituído. Além disso, suponho que você saiba o número da linha a ser substituída.
Os exemplos a seguir demonstram a remoção ou alteração do texto por números de linhas específicos:
fonte
para manipulação de arquivos de configuração
Eu vim com esta solução inspirada na resposta Skensell
configLine [searchPattern] [replaceLine] [filePath]
será:
Função:
a mágica do status de saída maluca vem de https://stackoverflow.com/a/12145797/1262663
fonte
Funciona bem
fonte
No meu makefile eu uso isso:
PS: NÃO se esqueça de que o -i altera realmente o texto no arquivo ... portanto, se o padrão que você definiu como "Revisão" mudar, você também mudará o padrão a ser substituído.
Exemplo de saída:
Portanto, se você definir o padrão "Revisão: 1190", obviamente não é o mesmo que você definiu como "Revisão:" apenas ...
fonte
O arquivo find_replace contém 2 colunas, c1 com o padrão correspondente, c2 com a substituição, o loop sed substitui cada linha contendo um dos padrões da variável 1
fonte
sed
uma vez com um arquivo de script contendo todas as substituições que você deseja executar. Executarsed -i
no mesmo arquivo repetidamente é um antipadrão horrível.É tão parecido com o anterior.
fonte
FOO=TEXT_TO_BE_REPLACED
paraFOO=This line ...
isso não atende à especificação.O comando abaixo está funcionando para mim. Que está trabalhando com variáveis
fonte
Costumo usar regex para extrair dados de arquivos que acabei de usar para substituir a citação literal
\"
por//
nada :-)fonte