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).