Faça várias edições com uma única chamada para sed

14

Estou tentando usar o sed para editar um arquivo de configuração. Gostaria de mudar algumas linhas. Eu sei que no Linux sed -ipermite edições no local, mas requer que você salve em um arquivo de backup. No entanto, gostaria de evitar vários arquivos de backup e fazer todas as alterações no local de uma só vez.

Existe uma maneira de fazer isso sed -iou existe uma alternativa melhor?

rclark
fonte

Respostas:

20

Você pode dizer sedpara realizar várias operações apenas repetindo -e(ou -fse o seu script estiver em um arquivo).

sed -i -e 's/a/b/g' -e 's/b/d/g' filefaz as duas alterações no arquivo único chamado filein-place. Sem um arquivo de backup.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' filefaz as duas alterações no arquivo único chamado filein-place. Com um único arquivo de backup chamado filebak.

EightBitTony
fonte
2
Observe que a sequência é importante. No comando de exemplo fornecido acima, todas as instâncias da letra asão transformadas be, em seguida, todas as instâncias de bsão transformadas em d. Você poderia fazer a mesma coisa com sed -i -e 's/a\|b/d/g' fileVire todas as instâncias de um ou outro aou bem d.
Curinga
4

Outra alternativa é ex, o antecessor de vi. Na verdade, é a ferramenta POSIX escolhida para edição de arquivos com script no local; é extraordinariamente mais flexível sed -ie, sem dúvida, ainda mais portátil que o Perl. (Se você ficar fora do mundo do Windows, é indiscutivelmente mais portátil que o Perl.)

Há uma relativa escassez nessa troca de pilha de comandos de exemplo usando ex, pelo menos em comparação com a infinidade de comandos de exemplo usando sed, awke Perl. No entanto, eu mesmo mergulhei bastante nas especificaçõesex do POSIX e tenho batido o tambor desde então. Escrevi muitas respostas usando exaqui e no stackexchange do vi / Vim:

Leitura adicional:

Curinga
fonte
3

Além de usar várias -eopções, você também pode separar os comandos sed em um único script sed usando novas linhas ou ponto e vírgula.

Este é o caso, se esse script for uma linha na linha de comando ou um arquivo de script.

por exemplo

sed -e 's/a/b/g ; s/b/d/g' file

Os caracteres de espaço ao redor do ;são opcionais. Usei-os aqui para garantir que o ponto-e-vírgula se destaque (em geral, exceto para novas linhas que separam comandos, o espaço em branco entre os comandos é ignorado ... mas não esqueça que o espaço em branco nos comandos pode ser e geralmente é significativo).

ou:

sed -e 's/a/b/g
        s/b/d/g' file
cas
fonte