sed com expressão múltipla para argumentação no local

23

Estou tentando substituir várias palavras no arquivo usando sed -i #expression1 #expression2

Arquivo

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Saída (desejada)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Experiências

Posso obter a seguinte saída usando sed -i2 vezes.

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Posso ter alguma maneira possível de fazer isso como um único comando no local, como

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Quando tentei o código acima, ele toma s/item/stuff/gcomo arquivo e tenta trabalhar nele.

JigarGandhi
fonte
Se seus arquivos forem semelhantes ao exemplo acima (ou seja, seguem o mesmo padrão), você poderá fazê-lo com uma única substituição:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Respostas:

26

Dependendo da versão do sedseu sistema, você poderá fazer

sed -i 's/Some/any/; s/item/stuff/' file

Você não precisa da gbarra final após o scomando aqui, pois está fazendo apenas uma substituição por linha.

Alternativamente:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

A -iopção diz sedpara editar arquivos no local; se houver caracteres imediatamente após o arquivo, -iele sedfará um backup do arquivo original e os usará como extensão do arquivo de backup. Por exemplo,

sed -i.bak 's/Some/any/; s/item/stuff/' file

ou

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

será modificado file, salvando o original em file.bak.

Obviamente, em um sistema Unix (ou semelhante ao Unix), normalmente usamos '~' em vez de '.bak', então

sed -i~ 's/Some/any/;s/item/stuff/' file
PM 2Ring
fonte
2
Observe que você está descrevendo a variante GNU. A variante BSD (como no FreeBSD ou OS / X) requer um argumento para -i. Então, sed -i '' 's/a/b/;s/c/d/' fileou sed -i .back 's/a/b/;s/c/d/'ou sed -i.back 's/a/b/;s/c/d/'não. Outras sedimplementações geralmente não suportam -i.
Stéphane Chazelas
Obrigado @ StéphaneChazelas por esclarecer isso. E acho que deveria ter sido mais explícito ao dizer que no GNU sed não pode haver um espaço entre -ia extensão e a extensão.
Página Inicial
sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpresultados sed: -e expression #1, char 141: unterminated s'comando`
alhelal
@alhelal Desculpe, os comentários não são o lugar certo para fazer perguntas. Mas de qualquer maneira, seu último scomando está faltando no final /.
PM 2Ring
@ PM2Ring, como eu não percebi que imaginei que estivesse relacionada à sua solução. No entanto, obrigado.
Alhelal
10

Você pode encadear expressões sed junto com ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4
Ian McGowan
fonte
5

Expressão múltipla usando várias -eopções:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

ou você pode usar apenas um:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Você deve fornecer uma extensão para o arquivo de backup, pois quando alguma implementação de sed, como OSX sed , não funcionar com extensão vazia (você deve sed -i ''substituir os arquivos originais).

cuonglm
fonte
1

Você pode usar o Vim no modo Ex:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % selecione todas as linhas

  2. s substituto

  3. x salvar e fechar

Steven Penny
fonte