Sed - Truques e dicas

Novembro 2016




Substituição

  • Substituir "foo" por bar" em cada linha
    • Somente na primeira ocorrência
      • sed 's/foo/bar/'
    • Somente na 3° ocorrência
      • sed 's/foo/bar/3'
    • Todas as ocorrências
      • sed 's/foo/bar/g'
    • Somente na penúltima ocorrência
      • sed 's/\(.*\)foo\(.*foo\)/\1bar\2/'
    • Somente na última ocorrência
      • sed 's/\(.*\)foo/\1bar/'
    • Substituir "foo" por "bar" somente as linhas que contém "plop"
      • sed '/plop/ s/foo/bar/g'
    • Substituir "foo" por "bar" exceto as linhas que contém "plop"
      • sed '/plop/! s/foo/bar/g'
    • Substituir "Foo" ou "foo" por "bar" em cada linha
      • sed 's/[Ff]oo/bar/g'
    • Substituir "azul" ou "branco" ou "vermelho" por "verde"
      • sed 's/azul\|branco\|vermelho/vert/g'

Afixagem

  • A primeira linha (head -1)
    • sed q
  • As 5 premeiras linhas (head -5)
    • sed '5q'
    • sed '1,5!d'
  • A última linha (tail -1)
    • sed -n '$p'
    • sed '$!d"
  • As 5 últimas linhas (tail -5)
    • sed -e :a -e '$q;N;6,$D;ba'
  • As 2 últimas linhas (tail -2)
    • sed '$!N;$!D'
  • Somente as linhas acertadas com um motivo ou uma expressão
    • sed -n '/motif/p'
    • sed '/regexp/!d'
  • Somente as linhas que não acertam com um motivo ou uma expressão regular
    • sed -n '/motivo/!p'
    • sed '/regexp/d'
  • A linhaque precede um motivo ou uma expressão regular
    • sed -n '/motif/{g;1!p;};h'
  • A linha seguindo um motivo ou uma expressão regular
    • sed -n '/regexp/{n;p;}'

Supressão

Espaço e tabulação

  • Eliminar os espaços e tabulações
    • Em início de linha
      • sed 's/^[ \t]*//
      • sed 's/^\s*//'    # Utilização do parâmetro "\s"
    • Em fim de linha
      • sed 's/[ \t]*$//'
    • No início e fim de linha
      • sed 's/^[ \t]*//;s/[ \t]*$//'

Linha vazia

  • Eliminar as linhas vazias
    • Todas as linhas vazias
      • sed '/^$/d'
      • sed '/./!d'
    • Unicamente aquelas de cabeçalho
      • sed '/./,$!d'
      • sed -nr '/./,$s/(.*)/\1/p'  # obrigado Adrien
    • Unicamente aquelas de fim
      • sed -e :a -e '/^\n*$/ {$d;N;ba' -e '}'

Intervalo regular

  • Eliminar uma linha com intervalos regulares
    • Todas as linhas pares
      • sed '1~2d'
    • Todas as linhas ímpares
      • sed '2~2d'
    • Todas as linhas a partir da linha n
      • sed '3~2d'    # Todas as 2 linhas a partir da linha 3

Diversos

Alcançar linhas

  • Alcançar linhas 2 por 2
    • sed '$!N;s/\n//'
  • Alcançar linhas 3 por 3
    • sed '$!N;s/\n//;$!N;s/\n//;'
  • Se uma linha se termina por um backslash (\), adicionar a linha seguinte e substituir o fim da linha (\n) por um espaço
    • sed -e :a -e '/\\$/N; s/\\\n/ /; ta'
  • Se uma linha começa por um signo igual (=), adicionar à linha precedente e substituir o signo igual (=) por um espaço
    • sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

Afixagem insensível à quebra


(Afixar unicamente as linhas correspondendo à um dado motivo com insensibilidade )


O comando "sed" possui um "flag" - veja - Introdução à SED - Parte I - que permite colocar em correspondência um motivo sem considerar a quebra, mas este flag se aplica somente ao comando de substituição (comando s) infelizmente.

Eis então uma dica que permite servir-se deste de ce flag para afixar (ou ao contrário não afixar ) das linhas correspondendo ao dado motivo sem considerar a quebra.
Basta para tanto empregar o comando de substituição "s" combinado ao metacaractere "&" e, é claro, ao flag "I".

Exemplo para afixar somente as linhas que contém o termo « motivo » (ou Motivo, MOTIVO, mOtIvo, MoTiVO, etc)
  • sed -n 's/motif/&/Ip' arquivo


Tradução feita por Ana Spadari

Veja também :
Este documento, intitulado « Sed - Truques e dicas  »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.