Só sed by Trevisan

só sed

Thobias Salazar Trevisan
21/05/2003


  1. Introdução
  2. Brincando com Linhas
  3. Brincando com Partes do texto
  4. Utilidade Pública


1. Introdução

Este texto se propõe a ser uma maneira fácil das pessoas acharem aquele sed perdido para resolver seu problema, ou seja, aqui vamos direto ao ponto, sem frescura ou enrolação.

Se você está procurando um texto que explique o SED, visite estes links:

1.1. Agradecimentos

A idéia de elaborar este documento surgiu em um mail do Aurélio para a lista de discussão sed-br. Se você quiser acompanhar as threads da criação aqui vão os links para as 3 threads principais:

  1. sed FAQ (era: Re: concatenar linhas
  2. FAQ sed
  3. Opine sobre o nome do documento da lista
Aqui vai meu muito obrigado para as pessoas que ajudaram na construção deste documento.

A galera que contribuiu:

1.2. Texto padrão

Em todos os exemplos vamos procurar manter sempre o mesmo texto para facilitar a compreensão das perguntas e respostas. Esperamos deste modo deixar o só sed mais amigável e que você ache a sua pergunta de maneira fácil e agil. =8)

Dica:

Leia o arquivo de entrada com calma. Analise-o, respire e releia-o.

Assim ficará mais fácil para você entender os exemplos e as mudanças ocorridas após a execução de cada sed.

O arquivo.txt de exemplo é:

  prompt> cat arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2. Brincando com Linhas


2.1. Imprimir somente as linhas com uma determinada string

sed -n '/dia/p'

  prompt> sed -n '/dia/p' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:


2.2. Imprimir somente a primeira ocorrência da linha com determinada string

sed -n '/dia/{p;q;}'

  prompt> sed -n '/dia/{p;q;}' arquivo.txt
   No segundo dia, fez um rascunho à lápis.


2.3. Imprimir a última ocorrência da linha com determinada string

sed -n '/dia/h;${x;p;}'

  prompt> sed -n '/dia/h;${x;p;}' arquivo.txt
     No quarto dia, ficou com preguiça, então falou:


2.4. Imprimir da primeira ocorrência da string até o final

sed '/dia/,$!d'

  prompt> sed '/dia/,$!d' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.5. Imprimir da última ocorrência da string até o final

sed -n '/dia/{h;${x;p;};d;};H;${x;p;}'

  prompt> sed -n '/dia/{h;${x;p;};d;};H;${x;p;}' arquivo.txt
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.6. Apagar as linhas com uma determinada string

sed '/dia/d'

  prompt> sed  '/dia/d' arquivo.txt
  No início do início, era um nada.
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.7. Apagar apenas a primeira linha com determinada string I

sed '/dia/{H;x;/^\n/d;g;}'

  prompt> sed '/dia/{H;x;/^\n/d;g;}' arquivo.txt
  No início do início, era um nada.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.8. Apagar apenas a primeira linha com determinada string II

sed -n '/dia/{:a;n;p;ba;};p'

  prompt> sed -n '/dia/{:a;n;p;ba;};p' arquivo.txt
  No início do início, era um nada.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.9. Adicionar texto no início da linha

sed 's/^/texto incluido/'

  prompt> sed 's/^/texto incluido/' arquivo.txt
  texto incluidoNo início do início, era um nada.
  texto incluido No segundo dia, fez um rascunho à lápis.
  texto incluido  No terceiro dia, apagou e começou tudo de novo.
  texto incluido   No quarto dia, ficou com preguiça, então falou:
  texto incluido
  texto incluido- Sexta-feira eu continuo, se não estiver cansado...
  texto incluido
  texto incluido  E no fim, nada.


2.10. Adicionar texto no final da linha

sed 's/$/texto incluido/'

  prompt> sed 's/$/texto incluido/' arquivo.txt
  No início do início, era um nada.texto incluido
   No segundo dia, fez um rascunho à lápis.texto incluido
    No terceiro dia, apagou e começou tudo de novo.texto incluido
     No quarto dia, ficou com preguiça, então falou:texto incluido
  texto incluido
  - Sexta-feira eu continuo, se não estiver cansado...texto incluido
  texto incluido
    E no fim, nada.texto incluido


2.11. Retirar linhas em branco

sed '/^$/d'

  prompt> sed '/^$/d' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  - Sexta-feira eu continuo, se não estiver cansado...
    E no fim, nada.


2.12. Incluir texto no início da linha N

OBS: troque o número 1 para a linha que você quiser

sed '1s/^/começo do arquivo/'

  prompt> sed '1s/^/começo do arquivo/'  arquivo.txt
  começo do arquivoNo início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.13. Incluir texto no final da linha N

OBS: troque o número 1 para a linha que você quiser

sed '1s/$/final da linha/'

  prompt> sed '1s/$/final da linha/' arquivo.txt
  No início do início, era um nada.final da linha
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.14. Incluir texto na linha N apagando o conteúdo existente

OBS: troque o número 1 para a linha que você quiser

sed '1s/.*/início do arquivo/'

  prompt> sed '1s/.*/início do arquivo/' arquivo.txt
  início do arquivo
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.15. Incluir texto antes da linha N

OBS: troque o número 1 para a linha que você quiser

sed -e '1i\' -e 'começo do arquivo'

  prompt> sed -e '1i\' -e 'começo do arquivo' arquivo.txt
  começo do arquivo
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.16. Incluir linha após a última

sed -e '$a\' -e 'linha final'

  prompt> sed -e '$a\' -e 'linha final' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.
  linha final


2.17. Imprimir somente a linha N

OBS: troque o número 2 para a linha que você quiser

sed '2!d'

  prompt> sed '2!d' arquivo.txt
   No segundo dia, fez um rascunho à lápis.


2.18. Retirar a linha N

OBS: troque o número 2 pela linha que você quiser

sed '2d'

  prompt> sed '2d' arquivo.txt
  No início do início, era um nada.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.19. Extrair um trecho de uma linha

OBS: O mesmo que cut -d, -f2

sed 's/^[^,]*,\([^,]\+\),\?.*/\1/'

  prompt> sed 's/^[^,]*,\([^,]\+\),\?.*/\1/' arquivo.txt
   era um nada.
   fez um rascunho à lápis.
   apagou e começou tudo de novo.
   ficou com preguiça
  
   se não estiver cansado...
  
   nada.


2.20. Retirar espaços em branco repetidos

sed 's/[ ]\+/ /g'

  prompt> sed 's/[ ]\+/ /g' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
   No terceiro dia, apagou e começou tudo de novo.
   No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
   E no fim, nada.


2.21. Retirar espaços em branco no início da linha

sed 's/^ \+//'

  prompt> sed 's/^ \+//' arquivo.txt
  No início do início, era um nada.
  No segundo dia, fez um rascunho à lápis.
  No terceiro dia, apagou e começou tudo de novo.
  No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
  E no fim, nada.


2.22. Apagar uma string do início da linha

sed 's/^No//'

  prompt> sed 's/^No//' arquivo.txt
   início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.23. Apagar do início da linha até uma string

sed 's/^.*dia//'

  prompt> sed 's/^.*dia//' arquivo.txt
  No início do início, era um nada.
  , fez um rascunho à lápis.
  , apagou e começou tudo de novo.
  , ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.24. Apagar de uma string até o final da linha

sed 's/dia.*$//'

  prompt> sed 's/dia.*$//' arquivo.txt
  No início do início, era um nada.
   No segundo 
    No terceiro 
     No quarto 
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.25. Apagar a última string da linha

sed 's/ [^ ]\+ *$//g'

  prompt> sed 's/ [^ ]\+ *$//g' arquivo.txt
  No início do início, era um
   No segundo dia, fez um rascunho à
    No terceiro dia, apagou e começou tudo de
     No quarto dia, ficou com preguiça, então
  
  - Sexta-feira eu continuo, se não estiver
  
    E no fim,


2.26. Colocar todas as linhas em uma só

sed ':a;$!N;s/\n//;ta;'

  prompt> sed ':a;$!N;s/\n//;ta;' arquivo.txt
  No início do início, era um nada. No segundo dia, fez um rascunho à lápis.  No terceiro dia, apagou e começou tudo de novo.   No quarto dia, ficou com preguiça, então falou:- Sexta-feira eu continuo, se não estiver cansado...  E no fim, nada.


2.27. Juntar a linha com a próxima

sed 'N;s/\n//'

  prompt> sed 'N;s/\n//' arquivo.txt
  No início do início, era um nada. No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.   No quarto dia, ficou com preguiça, então falou:
  - Sexta-feira eu continuo, se não estiver cansado...
    E no fim, nada.


2.28. Substituir caractere por outro até uma TAG

OBS: troca 'o' por 'x' até encontrar a primeira ','

sed ':a;s/^\([^,]\+\)o/\1x/;ta'

  prompt> sed ':a;s/^\([^,]\+\)o/\1x/;ta' arquivo.txt
  Nx inícix dx inícix, era um nada.
   Nx segundx dia, fez um rascunho à lápis.
    Nx terceirx dia, apagou e começou tudo de novo.
     Nx quartx dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu cxntinux, se não estiver cansado...
  
    E nx fim, nada.


2.29. Substituir caractere por outro entre TAGs

OBS: troca 'o' por 'x' entre a segunda e terceira ','

sed ':a;s/^\([^,]*,[^,]\+\)o/\1x/;ta'

  prompt> sed ':a;s/^\([^,]*,[^,]\+\)o/\1x/;ta' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunhx à lápis.
    No terceiro dia, apagxu e cxmeçxu tudx de nxvx.
     No quarto dia, ficxu cxm preguiça, então falou:
  
  - Sexta-feira eu continuo, se nãx estiver cansadx...
  
    E no fim, nada.


2.30. Substituir string por outra somente em certas linhas

OBS: substitui 'dia' por 'noite' somente em linhas que contém a string 'terceiro'

sed '/terceiro/s/dia/noite/g'

  prompt> sed '/terceiro/s/dia/noite/g' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro noite, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.31. Substituir string por outra somente em certas linhas II

OBS: substitui 'dia' por 'noite' nas linha que NÃO contém a string 'terceiro'

sed '/terceiro/!s/dia/noite/g'

  prompt> sed '/terceiro/!s/dia/noite/g' arquivo.txt
  No início do início, era um nada.
   No segundo noite, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto noite, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.32. Substituir a última ocorrência de uma string por outra

sed ':a;$!{N;ba;};s/\(.*\)dia/\1noite/'

  prompt> sed ':a;$!{N;ba;};s/\(.*\)dia/\1noite/' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto noite, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


2.33. Trocar a ordem das palavras (última vira primeira, penúltima vira segunda....)

OBS: se o seu arquivo tiver o caractere '§' troque o '§' do sed por outro carectere que não exista.

sed 's/^/§ /;:a;s/\(.*\)§ \+\([^ ]\+\)/\2 \1§/;ta;s/§//'

  prompt> sed 's/^/§ /;:a;s/\(.*\)§ \+\([^ ]\+\)/\2 \1§/;ta;s/§//' arquivo.txt
  nada. um era início, do início No 
  lápis. à rascunho um fez dia, segundo No 
  novo. de tudo começou e apagou dia, terceiro No 
  falou: então preguiça, com ficou dia, quarto No 
   
  cansado... estiver não se continuo, eu Sexta-feira - 
   
  nada. fim, no E 


2.34. Trocar a ordem das letras (igual ao comando rev)

sed 's/^/§/;:a;s/\(.*\)§\(.\)/\2\1§/;ta;s/§$//'

  prompt> sed 's/^/§/;:a;s/\(.*\)§\(.\)/\2\1§/;ta;s/§$//' arquivo.txt
  .adan mu are ,oicíni od oicíni oN
  .sipál à ohnucsar mu zef ,aid odnuges oN 
  .ovon ed odut uoçemoc e uogapa ,aid oriecret oN  
  :uolaf oãtne ,açiugerp moc uocif ,aid otrauq oN   
  
  ...odasnac revitse oãn es ,ounitnoc ue arief-atxeS -
  
  .adan ,mif on E  


2.35. Trocar de maiúsculas para minúsculas

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/'

  prompt> sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/' arquivo.txt
  no início do início, era um nada.
   no segundo dia, fez um rascunho à lápis.
    no terceiro dia, apagou e começou tudo de novo.
     no quarto dia, ficou com preguiça, então falou:
  
  - sexta-feira eu continuo, se não estiver cansado...
  
    e no fim, nada.


2.36. Trocar de minúsculas para maiúsculas

sed 'y/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/'

  prompt> sed 'y/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/' arquivo.txt
  NO INÍCIO DO INÍCIO, ERA UM NADA.
   NO SEGUNDO DIA, FEZ UM RASCUNHO À LÁPIS.
    NO TERCEIRO DIA, APAGOU E COMEÇOU TUDO DE NOVO.
     NO QUARTO DIA, FICOU COM PREGUIÇA, ENTÃO FALOU:
  
  - SEXTA-FEIRA EU CONTINUO, SE NÃO ESTIVER CANSADO...
  
    E NO FIM, NADA.


3. Brincando com Partes do texto


3.1. Imprimir a linha antes de uma string

sed -n '/segundo/{x;p;};h'

  prompt> sed -n '/segundo/{x;p;};h' arquivo.txt
  No início do início, era um nada.


3.2. Imprimir a linha antes de uma string e a linha da string

sed -n '/segundo/{H;x;p;};h'

  prompt> sed -n '/segundo/{H;x;p;};h' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.


3.3. Imprimir a linha após uma string

sed -n '/segundo/{n;p;}'

  prompt> sed -n '/segundo/{n;p;}' arquivo.txt
    No terceiro dia, apagou e começou tudo de novo.


3.4. Imprimir a linha após uma string e a linha da string

sed -n '/segundo/{N;p;}'

  prompt> sed -n '/segundo/{N;p;}' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.


3.5. Imprimir a linha anterior, posterior e a linha que contém uma string

sed -n '/terceiro/{H;x;p;n;p;};h'

  prompt> sed -n '/terceiro/{H;x;p;n;p;};h' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:


3.6. Imprimir a linha anterior e posterior a linha que contém uma string

sed -n '/terceiro/{x;p;n;p;};h'

  prompt> sed -n '/terceiro/{x;p;n;p;};h' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
     No quarto dia, ficou com preguiça, então falou:


3.7. Imprimir N linhas antes, a linha da string e M linhas após uma string I

OBS: 'quarto' é a string, troque o '2' de 1,2 para o número de linhas antes, e adicione quantos 'Ns' para linhas após. No exemplo está 2 antes e 2 depois

sed -n '/quarto/{x;p;x;N;N;p;q;};1!{H;g;};1,2!s/[^\n]*\n//;h;'

  prompt> sed -n '/quarto/{x;p;x;N;N;p;q;};1!{H;g;};1,2!s/[^\n]*\n//;h;' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...


3.8. Imprimir N linhas antes, a linha da string e M linhas após uma string II

OBS: troque o número entre chaves '{2}' pelo número de linhas antes da string e adicione quandos 'Ns' para linhas após. No exemploestá 2 antes e 2 depois

sed 'H;/quarto/{g;N;N;s/^\n//p;}; x;s/.*\(\(\n[^\n]*\)\{2\}\)/\1/;x ;d'

  prompt> sed 'H;/quarto/{g;N;N;s/^\n//p;}; x;s/.*\(\(\n[^\n]*\)\{2\}\)/\1/;x ;d' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...


3.9. Adicionar linha antes de uma string

OBS: inclui o 'Texto adicionado' antes da linha com a string 'segundo'

sed '/segundo/{h;s/.*/Texto adicionado/;p;x;}'

  prompt> sed '/segundo/{h;s/.*/Texto adicionado/;p;x;}' arquivo.txt
  No início do início, era um nada.
  Texto adicionado
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


3.10. Adicionar linha após a linha com uma determinada string

sed '/segundo/{p;s/.*/Texto adicionado/;}'

  prompt> sed '/segundo/{p;s/.*/Texto adicionado/;}' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
  Texto adicionado
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


3.11. Imprimir somente entre linha N e M

sed '4,6!d'

  prompt> sed '4,6!d' arquivo.txt
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...


3.12. Substituir uma string por outra somente entre determinadas linhas

sed '3,6s/dia/noite/'

  prompt> sed '3,6s/dia/noite/' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro noite, apagou e começou tudo de novo.
     No quarto noite, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


3.13. Imprimir linhas que contém uma ou outra string

OBS: imprime linhas que contém a string 'segundo' ou 'quarto'

sed '/segundo\|quarto/!d'

  prompt> sed '/segundo\|quarto/!d' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
     No quarto dia, ficou com preguiça, então falou:


3.14. Imprimir linhas que contém uma e outra string

OBS: imprime linhas que contém 'No' e 'segundo'

sed -n '/No.*segundo/p'

  prompt> sed -n '/No.*segundo/p' arquivo.txt
   No segundo dia, fez um rascunho à lápis.


3.15. Extrair um trecho do arquivo

sed -n '/segundo/,/quarto/p'

  prompt> sed -n '/segundo/,/quarto/p' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:


3.16. Extrair trecho que pode ou não estar na mesma linha

sed -n '/segundo/{:a;/quarto/!{N;ba;};p;}'

  prompt> sed -n '/segundo/{:a;/quarto/!{N;ba;};p;}' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:


3.17. Extrair trecho que pode ou não estar na mesma linha tirando os delimitadores

OBS: 'segundo' é a TAG inicial e 'falou' a TAG final

sed -n '/segundo/{/falou/tc;:a;/falou/!{N;ba;};:c;s/.*segundo//;s/falou.*$//;p;}'

  prompt> sed -n '/segundo/{/falou/tc;:a;/falou/!{N;ba;};:c;s/.*segundo//;s/falou.*$//;p;}' arquivo.txt
   dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então 


3.18. Apagar o que está entre delimitadores

sed '/segundo/{/falou/{s/segundo.*falou//;t};:a;/falou/!{N;s/\n//;ta;};s/segundo.*falou/\n/;}'

  prompt> sed '/segundo/{/falou/{s/segundo.*falou//;t};:a;/falou/!{N;s/\n//;ta;};s/segundo.*falou/\n/;}' arquivo.txt
  No início do início, era um nada.
   No n:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


3.19. Apagar um trecho se ele contém um padrão

OBS: 'segundo' marca o início do trecho, 'quarto' o final, e 'rascunho' é o padrão de procura

sed '/segundo/{:a;/quarto/!{N;ba;};/rascunho/d;}'

  prompt> sed '/segundo/{:a;/quarto/!{N;ba;};/rascunho/d;}' arquivo.txt
  No início do início, era um nada.
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


3.20. Trocar de lugar a linha com a próxima (troca de lugar linha 1 com 2, 3 com 4...) I

sed -n '$ba;h;n;p;x;:a;p'

  prompt> sed -n '$ba;h;n;p;x;:a;p' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
  No início do início, era um nada.
     No quarto dia, ficou com preguiça, então falou:
    No terceiro dia, apagou e começou tudo de novo.
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.
  


3.21. Trocar de lugar a linha com a próxima (troca de lugar linha 1 com 2, 3 com 4...) II

sed 'N;s/\([^\n]*\)\(\n\)\([^\n]*\)/\3\2\1/'

  prompt> sed 'N;s/\([^\n]*\)\(\n\)\([^\n]*\)/\3\2\1/' arquivo.txt
   No segundo dia, fez um rascunho à lápis.
  No início do início, era um nada.
     No quarto dia, ficou com preguiça, então falou:
    No terceiro dia, apagou e começou tudo de novo.
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.
  


4. Utilidade Pública


4.1. Retirar comandos HTML (tudo entre < e >)

sed 's/<[^>]*>//g'

  prompt> sed 's/<[^>]*>//g' arquivo.txt
  No início do início, era um nada.
   No segundo dia, fez um rascunho à lápis.
    No terceiro dia, apagou e começou tudo de novo.
     No quarto dia, ficou com preguiça, então falou:
  
  - Sexta-feira eu continuo, se não estiver cansado...
  
    E no fim, nada.


4.2. Pesquisar se existe algum usuário sem senha no /etc/passwd

sed -n '/^[^:]\+::/p'

  prompt> sed -n '/^[^:]\+::/p' arquivo.txt


This HTML page is (see source)

Comentários