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:
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. Introdução
1.1. Agradecimentos
A galera que contribuiu: |
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.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. |
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. |
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. |
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. |
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. |
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.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: |
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... |
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... |
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. |
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: |
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. |
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.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)