sed com expressão múltipla para argumento in-loco

19

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

Eu posso obter a seguinte saída usando sed -i por 2 vezes.

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

Posso ter qualquer maneira de fazer isso como um único comando no local, como

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

Quando experimentei o código, é preciso usar s/item/stuff/g como arquivo e tentar trabalhar nele.

    
por JigarGandhi 17.12.2014 / 06:51

4 respostas

20

Dependendo da versão do sed no seu sistema, você poderá fazer

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

Você não precisa do g após a barra final no comando s aqui, pois você só está fazendo uma substituição por linha.

Alternativamente:

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

A opção -i informa sed para editar arquivos no lugar; se houver caracteres imediatamente após o -i , então sed faz um backup do arquivo original e usa esses caracteres 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

modificará file , salvando o original em file.bak .

Claro, em um sistema Unix (ou Unix-like), normalmente usamos '~' ao invés de '.bak', então

sed -i~ 's/Some/any/;s/item/stuff/' file
    
por 17.12.2014 / 07:05
10

Você pode encadear expressões sed 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
    
por 17.12.2014 / 06:55
5

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

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, desde quando alguma implementação de sed , como OSX sed não funciona com extensão vazia (você deve usar sed -i '' para substituir os arquivos originais).

    
por 17.12.2014 / 06:55
1

Você pode usar o Vim no modo Ex:

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

  2. s substituto

  3. x salvar e fechar

por 17.04.2016 / 05:00