Linux Admin - Comando sed
sedé um utilitário complexo de dominar. Este comando flui o editor para filtrar e transformar texto. Livros inteiros foram escritos dedicados ao uso proficiente do sed. Portanto, tenha em mente que este tutorial tem o objetivo de apresentar três usos básicos comuns do sed -
- substituição de personagem
- operações de impressão
- apagar operações
A sintaxe de comando comum para sed é -
sed [options] [file to operate on]
A seguir estão os switches sed comuns para lembrar.
Interruptor | Açao |
---|---|
-Eu | Edite arquivos no local em vez de transmitir, -i [SUFFIX] para criar o arquivo de backup |
-e | Adicione os comandos de script a serem executados |
-n | Silencie, suprima a impressão automática |
-r | ReGex, use expressões regulares estendidas no script |
-iirá aplicar as alterações a um arquivo, em vez de editar o fluxo do arquivo conforme passado para o sed .
sed , quando usado com o-eopção estende o comando para processar várias operações em um fluxo. Isso pode ser feito em vez de enviar o sed recursivamente.
echo "Windows and IIS run the Internet" | sed -e 's/Windows/Linux/' -e 's/ and
IIS//' -e 's/run/runs/'
Linux runs the Internet
o -na opção com sed suprime a impressão padrão em stdout. Usando o comando print do sed, como vemos, cada linha será duplicada para stdout.
bash-3.2# sed 'p' ./lines.txt
line1
line1
line2
line2
Desta vez, usamos a opção -n com sed -
bash-3.2# sed -n 'p' ./lines.txt
line1
line2
sed enviará fluxos de conteúdo para stdout. Quando o ' p ' ou comando de impressão é adicionado, um fluxo separado é enviado para cada linha, fazendo com que todas as linhas sejam duplicadas em stdout.
comando de substituição sed
Este comando é especificado com o 's'opção. Já vimos o sed ser usado com seu comando de substituição algumas vezes. A seguir está um exemplo simples -
[[email protected] Documents]# echo "developers eat veggies and fruit" | sed -e
's/veggies/pizza/' -e 's/fruit/coffee/'
developers eat pizza and coffee
[[email protected] Documents]#
Vamos tentar este, em um arquivo chamado dev.txt -
[[email protected] centos]# cat dev.txt
Developers code all night and sleep all day.
[[email protected] centos]#
Agora, vamos mudar o conteúdo de um arquivo em vez de apenas seu fluxo de saída enviado para sed -
[[email protected] centos]# sed -ibak 's/sleep/code/' ./dev.txt
[[email protected] centos]# ls dev*
dev.txt dev.txtbak
[[email protected] centos]# cat dev*
Developers code all night and code all day.
Developers code all night and sleep all day.
[[email protected] centos]#
Note - Usamos -i opção com um sufixo exclusivo para criar um arquivo de backup.
comando de impressão sed
Este comando é especificado com o comando ' p '.
Vamos usar nosso arquivo names.txt, a saída foi editada por questão de brevidade -
[[email protected] Documents]# sed -n "p" ./names.txt
Ted:Daniel:101
Jenny:Colon:608
Dana:Maxwell:602
Marian:Little:903
Bobbie:Chapman:403
Nicolas:Singleton:203
Dale:Barton:901
Aaron:Dennis:305
sed permite o uso de "endereços", para definir mais granularmente o que está sendo impresso no stdout -
[[email protected] Documents]# sed -n "1,10p" ./names.txt
Ted:Daniel:101
Jenny:Colon:608
Dana:Maxwell:602
Marian:Little:903
Bobbie:Chapman:403
Nicolas:Singleton:203
Dale:Barton:901
Aaron:Dennis:305
Santos:Andrews:504
Jacqueline:Neal:102
[[email protected] Documents]#
Assim como head , imprimimos as primeiras 10 linhas de nosso arquivo names.txt.
E se quiséssemos apenas imprimir aqueles com escritório no 9º andar?
[[email protected] Documents]# sed -n "/90/p" ./names.txt
Marian:Little:903
Dale:Barton:901
Kellie:Curtis:903:
Gina:Carr:902
Antonia:Lucas:901
[[email protected] Documents]#
Bem fácil. Também podemos imprimir todos, exceto aqueles com escritórios no 9º andar -
[[email protected] Documents]# sed -n '/90/ !p' ./names.txt
Ted:Daniel:101
Jenny:Colon:608
Dana:Maxwell:602
Bobbie:Chapman:403
Nicolas:Singleton:203
Aaron:Dennis:305
Santos:Andrews:504
Jacqueline:Neal:102
Billy:Crawford:301
Rosa:Summers:405
Matt:Davis:305
Francisco:Gilbert:101
Sidney:Mac:100
Heidi:Simmons:204
Matt:Davis:205
Cristina:Torres:206
Sonya:Weaver:403
Donald:Evans:403
No código acima, negamos 'p'operação de impressão entre / e / com !. Isso funciona de forma semelhante ao "d" ou comando delete . No entanto, os resultados podem variar com a negação no sed . Portanto, como regra geral: p para imprimir e negar o que você não deseja.
comando deletar sed
Conforme mencionado, o comando delete é o oposto do comando sed print. Vamos começar com nosso arquivo name.txt -
[[email protected] Documents]# sed 'd' ./names.txt
[[email protected] Documents]#
Nada impresso. Com o comando acima, pedimos ao sed para deletar todas as linhas de stdout no stream. Agora, vamos imprimir apenas as duas primeiras linhas e "excluir" o resto do fluxo -
[[email protected] Documents]# sed '1,2 !d' ./names.txt
Ted:Daniel:101
Jenny:Colon:608
[[email protected] Documents]#
Vejo? Semelhante ao ' p ' ou comando de impressão. Agora vamos fazer algo útil com o comando delete. Digamos que queremos remover todas as linhas em branco de um arquivo -
[[email protected] Documents]# cat lines.txt
line1
line2
line3
line4
line5
[[email protected] Documents]#
Não é incomum receber um arquivo como este contendo texto confuso, ao copiar e colar um e-mail ou formatado com quebras de linha fora do padrão. Em vez de editar interativamente o arquivo no vim, podemos usar o sed para fazer o trabalho para nós.
[[email protected] Documents]# sed -i '/^\s*$/ d' ./lines.txt
[[email protected] Documents]# cat ./lines.txt
line1
line2
line3
line4
line5
[[email protected] Documents]#
O arquivo agora está formatado de forma facilmente legível.
Note - Ao fazer alterações em arquivos importantes, use -iinterruptor. Anexar um sufixo de backup de arquivo é altamente recomendado para reservar o conteúdo do arquivo ( sed pode fazer algumas alterações extremas com o menor erro de digitação).