Introdução

Introdução

Bem -vindo à segunda parte de nossa série, uma parte que se concentrará no SED, a versão GNU. Como você verá, existem várias variantes do SED, que estão disponíveis para algumas plataformas, mas vamos nos concentrar nas versões GNU sed 4.x. Muitos de vocês já ouviram falar de sed e já o usaram, principalmente como uma ferramenta de substituição. Mas isso é apenas um segmento do que o SED pode fazer, e faremos o possível para mostrar o máximo possível do que você pode fazer com isso. O nome significa Editor de fluxo, e aqui "Stream" pode ser um arquivo, um tubo ou simplesmente stdin. Esperamos que você tenha conhecimento básico do Linux e se você já trabalhou com expressões regulares ou pelo menos saiba o que é um regexp, melhor. Não temos espaço para um tutorial completo sobre expressões regulares, então, em vez disso, apenas lhe daremos uma ideia básica e muitos exemplos de sed. Existem muitos documentos que lidam com o assunto, e teremos algumas recomendações, como você verá em um minuto.

Instalação

Não há muito o que dizer aqui, porque é provável que você já tenha instalado o Sed, porque é usado em vários scripts do sistema e uma ferramenta inestimável na vida de um usuário Linux que deseja ser eficiente. Você pode testar qual versão você tem digitando

 $ sed -versão

No meu sistema, este comando me diz que eu tenho GNU sed 4.2.1 instalado, além de links para a página inicial e outras coisas úteis. O pacote é nomeado simplesmente 'sed', independentemente da distribuição, mas se o gentoo oferece sed implicitamente, acredito que isso significa que você pode ter certeza.

Conceitos

Antes de irmos mais longe, sentimos que é importante ressaltar o que exatamente é que sed, porque o "editor de fluxo" pode não tocar muitos sinos. O SED pega o texto de entrada, faz as operações especificadas em todas as linhas (a menos que especificado de outra forma) e imprime o texto modificado. As operações especificadas podem ser anexadas, inserir, excluir ou substituir. Isso não é tão simples quanto parece: esteja avisado que existem muitas opções e combinações que podem tornar um comando sed bastante difícil de digerir. Então, se você quiser usar sed, recomendamos que você aprenda o básico do regexps, e você pode pegar o resto enquanto vai. Antes de iniciarmos o tutorial, queremos agradecer a Eric Pement e outros pela inspiração e pelo que ele fez por todos que querem aprender e usar sed.



Expressões regulares

Como os comandos/scripts sed tendem a se tornar enigmáticos, sentimos que nossos leitores devem entender os conceitos básicos em vez de copiar e colar cegamente os comandos, eles não sabem o significado de. Quando alguém quer entender o que é um regexp, a palavra -chave é "combinando". Ou melhor ainda, “correspondência de padrões”. Por exemplo, em um relatório para o seu departamento de RH, você escreveu o nome de Nick ao se referir ao arquiteto de rede. Mas Nick seguiu em frente e John veio a tomar seu lugar, então agora você tem que substituir a palavra Nick por John. Se o arquivo for chamado Relatório.txt, você poderia fazer

 $ CAT Relatório.txt | sed 's/nick/John/g'> report_new.TXT

Por padrão, o sed usa o stdout, então você pode usar o operador de redirecionamento do seu shell, como no nosso exemplo abaixo. Este é um exemplo mais simples, mas ilustramos alguns pontos: combinamos com o padrão "Nick" e substituímos todas as instâncias por "John". Observe que o SED é sensível ao maiúsculas, então tenha cuidado e verifique seu arquivo de saída para ver se todas as substituições foram feitas. O exposto acima poderia ter sido escrito também assim:

 $ sed 's/nick/John/g' relatório.txt> report_new.TXT

Ok, mas onde estão as expressões regulares, você pergunta? Bem, primeiro queríamos molhar os pés com o conceito de correspondência e aqui vem a parte interessante.

Se você não tem certeza se você escreveu "Nick" por engano em vez de "Nick" e quer combinar isso também, você pode usar sed 's/nick | nick/John/g'. A barra vertical tem o mesmo significado que você deve saber se usou C, ou seja, sua expressão corresponderá à Nick ou usuario. Como você verá, o tubo também pode ser usado de outras maneiras, mas seu significado permanecerá. Outros operadores amplamente utilizados em regexps são '?', isso corresponde a zero ou uma instância do elemento anterior (flavou?r combinará com sabor e sabor), '*' significa zero ou mais e '+' corresponde a um ou mais elementos. '^' corresponde ao início da string, enquanto '$' faz o oposto. Se você é um usuário vi (m), algumas dessas coisas podem parecer familiares. Afinal, esses utilitários, juntamente com awk ou c, têm suas raízes nos primeiros dias do Unix. Não insistiremos mais sobre o assunto, pois as coisas se tornarão mais simples ao ler exemplos, mas o que você deve saber é que existem várias implementações de regexps: Posix, Posix estendido, Perl ou várias implementações de expressões regulares, garantidas para dar a dar Você é uma dor de cabeça.



Exemplos de sed

Aprendendo o comando linux sed com exemplos
Sintaxe do comando linux Descrição do comando linux
relatório sed 's/nick/John/g'.TXT
Substitua cada ocorrência de Nick por John no relatório.TXT
sed 's/nick | nick/John/g' relatório.TXT
Substitua cada ocorrência de Nick ou Nick por John.
arquivo sed 's/^/'.txt> file_new.TXT
Adicione 8 espaços à esquerda de um texto para impressão bonita.
sed -n '/, claro/,/atenção você \
Pay/P 'MyFile

Exibir apenas um parágrafo, começando com "Claro"

e terminando em “atenção que você presta”

arquivo de 12,18p sed -n.TXT
Mostre apenas as linhas 12-18 do arquivo.TXT
SED 12,18D Arquivo.TXT
Mostre todo o arquivo.txt, exceto para linhas de 12 a 18
arquivo g g.TXT 
Arquivo de espaço duplo.TXT
script sed -f.arquivo sed.TXT
Escreva todos os comandos no script.sed e executá -los
sed '5!s/ham/queijo/'arquivo.TXT
Substitua o presunto por queijo no arquivo.txt, exceto na 5ª linha
arquivo sed '$ d'.TXT
Exclua a última linha
sed '/[0-9] \ 3 \/p' arquivo.TXT
Imprima apenas linhas com três dígitos consecutivos
sed '/boom/!arquivo s/aaa/bb/'.TXT
A menos que o boom seja encontrado substitua AAA por BB
sed '17,/Disk/D 'Arquivo.TXT
Exclua todas as linhas da linha 17 para o 'disco'
eco um dois | sed "s/um/unos/i"

Substitui um por UNOS de maneira insensível ao caso,

Então ele imprimirá “Uno dois”

arquivo 'g; g'.TXT
Um arquivo triplo um arquivo
sed 's/.$ // 'arquivo.TXT
Uma maneira de substituir os 2unix 🙂
sed 's/ ^[ ^t]*//' arquivo.TXT
Exclua todos os espaços na frente de todas as linhas de arquivo.TXT
sed 's/[ ^t]*$ //' arquivo.TXT
Exclua todos os espaços no final de todas as linhas de arquivo.TXT
sed 's/ ^[ ^t]*//; s/[ ^]*$ //' arquivo.TXT

Exclua todos os espaços na frente e no final de todas as linhas

de arquivo.TXT

sed 's/foo/bar/' arquivo.TXT
Substitua Foo por barra apenas para a primeira instância em uma linha.
sed 's/foo/bar/4' arquivo.TXT
Substitua Foo pela barra apenas para a 4ª instância em uma linha.
arquivo sed 's/foo/bar/g'.TXT 
Substitua Foo por barra para todas as instâncias em uma linha.
arquivo sed '/baz/s/foo/bar/g'.TXT
Somente se a linha contiver baz, substitua Foo por bar
sed '/./,/^$/!arquivo d '.TXT
Exclua todas as linhas em branco consecutivas, exceto o EOF
sed '/^$/n;/\ n $/d' arquivo.TXT

Exclua todas as linhas em branco consecutivas, mas permite

apenas linha em branco superior

sed '/./, $!arquivo d '.TXT
Exclua todas as linhas em branco líderes
sed -e: a -e '/^\ n*$/$ d; n;;/\ n $/ba' \
arquivo.TXT
Exclua todas as linhas em branco à direita
sed -e: a -e '/\\ $/n; S/\\\\ n //; ta '\
arquivo.TXT

Se um arquivo terminar em uma barra de barra, junte -se com o próximo (útil

para scripts de shell)

sed '/regex/,+5/expr/'
Combine o regex mais as próximas 5 linhas
arquivo '1 ~ 3d'.TXT
Exclua cada terceira linha, começando com o primeiro
arquivo sed -n '2 ~ 5p'.TXT
Imprima cada 5ª linha começando com a segunda
relatório sed 's/[nn] ick/John/g'.TXT

Outra maneira de escrever algum exemplo acima.

Você consegue adivinhar qual?

sed -n '/re/p; q;' arquivo.TXT

Imprima apenas a primeira partida de

Re (expressão regular)

sed '0,/re/// d;' arquivo.TXT
Exclua apenas a primeira partida
sed '0,/re/s // para_that/' arquivo.TXT
Altere apenas a primeira partida
sed 's/^[^,]*,/9999,/' arquivo.CSV
Altere o primeiro campo para 9999 em um arquivo CSV
s/^ *\ (.*[^] \) *$/| \ 1 |/;
s/" *, */" |/g;
: laço
s/| *\ ([^", |] [^, |] *\) *, */| \ 1 |/g;
s/| *, */| \ 1 |/g;
T loop
s/ *|/|/g;
s/| */|/g;
s/^| \ (.*\) | $/\ 1/;

script sed para converter o arquivo CSV em separado por barras

(funciona apenas em alguns tipos de CSV,

com “s e vírgulas incorporado)

sed ': a; s/\ (^\ | [^0-9.] \) \ ([0-9] \+\) \\
([0-9] \ 3 \ \)/\ 1 \ 2, \ 3/g; ta 'arquivo.TXT
Altere os números do arquivo.txt de 1234.56 formulário para 1.234.56
sed -r "s/\<(reg|exp)[a-z]+/\U&/g"
Converta qualquer palavra que inicia com Reg ou Exp em maiúsculas
sed '1,20 s/Johnson/white/g' arquivo.TXT

Substituição de Johnson com branco apenas em

linhas entre 1 e 20

sed '1,20 !Arquivo S/Johnson/White/G '.TXT
O acima revertido (corresponde a todos, exceto linhas 1-20)
sed '/de/,/até/s/\/magenta/g; \
s/\/ciano/g; ' arquivo.TXT
Substitua apenas entre "de" e "até"
sed '/endNotes:/, $ s/schaff/herzog/g; \
S/Kraft/Ebbing/G; ' arquivo.TXT
Substitua apenas da palavra “NOTAS END
sed '/./H; $!d;; x;/regex/!arquivo d '.TXT
Imprima parágrafos apenas se eles contiverem regex
 sed -e '/./H; $!d; '-e' x;/re1/!d; \
/Re2/!d;/re3/!arquivo d '.TXT

Imprima parágrafos apenas se eles contiverem Re1,

Re2 e Re3

 sed ': a; /\\ $/n; S/\\\\ n //; arquivo ta '.TXT

Junte -se a duas linhas nas primeiras extremidades em uma barra de barra

 sed 's/14 "/quatorze polegadas/g' arquivo.TXT

É assim que você pode usar citações duplas

 sed 's/\/alguns \/unix \/path/\/a \/new \\
/Path/G 'Arquivo.TXT

Trabalhando com caminhos Unix

 sed 's/[a g] // g' arquivo.TXT

Remova todos os caracteres de A a G do arquivo.TXT

sed 's/\ (.*\) foo/\ 1bar/'arquivo.TXT
Substitua apenas a última partida de Foo com a barra
sed '1!G; h; $!d ' 
Uma substituição TAC
sed '/\ n/!G; s/\ (.\) \ (.*\ n \)/& \ 2 \ 1 \
/; // d; s/.// '
Uma substituição de revisão
arquivo 10q sed.TXT
Uma substituição da cabeça
sed -e: a -e '$ q; n; 11, $ d; ba' \
arquivo.TXT
Uma substituição da cauda
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D '\
arquivo.TXT
Uma substituição uniq
sed '$!N; s/^\ (.*\) \ n \ 1 $/\ 1/; \
t; Arquivo d '.TXT
O oposto (ou uniq -d equivalente)
sed '$!N; $!Arquivo d '.TXT
Equivalente a cauda -n 2
arquivo sed -n '$ p'.TXT
… Tail -N 1 (ou cauda -1)
sed '/regexp/!arquivo d '.TXT
Grep equivalente
sed -n '/regexp/g; 1!p;; h 'arquivo.TXT

Imprima a linha antes do regexp correspondente, mas

não aquele que contém o regexp

sed -n '/regexp/n; p;' arquivo.TXT
Imprima a linha após a que corresponde ao regexp, mas

não aquele que contém o regexp

Arquivo sed '/padrão/d'.TXT
Excluir linhas de correspondência padrão
sed '/./!arquivo d '.TXT
Exclua todas as linhas em branco de um arquivo
sed '/^$/n;/\ n $/n; // d' arquivo.TXT

Exclua todas as linhas em branco consecutivas

Exceto pelos dois primeiros

sed -n '/^$/p; h;;/./x;/./p; '\
arquivo.TXT
Exclua a última linha de cada parágrafo
sed 's/.\ x08 // G 'Arquivo
Remova o NROFF Overstrikes
sed '/^$/q'
Obtenha o cabeçalho do correio
sed '1,/^$/d'
Obtenha o corpo do correio
sed '/^Assunto: */!d; s ///; q '
Obtenha o assunto do correio
sed 's/^/>/'

Citação de mensagem de correio inserindo um

“>” Na frente de cada linha

sed 's/^> //'
O oposto (mensagem de email inquote)
sed -e: a -e 's/]*> // g;/ 
Remova as tags HTML
sed '/./H; d;; x; s/\ n/= nl =/g '\
arquivo.txt | organizar \
| sed '1s/= nl = //; s/= nl =/\ n/g'
Classificar parágrafos de arquivo.txt em ordem alfabética
sed 's@/usr/bin@&/local@g' caminho.TXT
Substitua/usr/bin com/usr/bin/local no caminho.TXT
sed 's@^.*$@<<>> @g 'caminho.TXT
Experimente e veja 🙂
sed 's/\ (\/[^:]*\).*/\ 1/g 'caminho.TXT

Caminho fornecido.txt contém $ caminho, isso vai

eco apenas o primeiro caminho em cada linha

sed 's/\ ([^:]*\).*/\ 1/'/etc/passwd

Subsente Awk - exibe apenas os usuários

Do arquivo passwd

eco "Bem -vindo ao The Geek Stuff" | sed \
's/\ (\ b [a-z] \)/\ (\ 1 \)/g'
(W) elCome (t) o (t) ele (g) eek (s) tuff
Auto-explicativo
sed -e '/^$/,/^end/s/hills/\
Montanhas/G 'Arquivo.TXT

Troque 'Hills' por 'montanhas', mas apenas em blocos

de texto começando

com uma linha em branco e terminando com uma linha começando

com os três caracteres 'fim', inclusive

sed -e '/^#/d'/etc/serviços | mais
Veja o arquivo de serviços sem as linhas comentadas
sed '$ s@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\
\)@\ 3: \ 2: \ 1@g 'caminho.TXT
Ordem reversa dos itens na última linha de caminho.TXT
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\
-arquivo e h.TXT

Imprima 1 linha de contexto antes e depois da correspondência da linha,

com um número de linha em que a correspondência ocorre

sed '/regex/x; p; x;' arquivo.TXT
Insira uma nova linha acima de cada linha correspondente a regex
sed '/aaa/!d; /BBB/!d; /Ccc/!arquivo d '.TXT
Combine AAA, BBB e CCC em qualquer ordem
sed '/aaa.*BBB.*CCC/!arquivo d '.TXT
Combine AAA, BBB e CCC nessa ordem
sed -n '/^.\ 65 \/p 'arquivo.TXT
Linhas de impressão 65 chars longos ou mais
sed -n '/^.\ 65 \/!arquivo p '.TXT
Linhas de impressão 65 chars longos ou menos
arquivo sed '/regex/g'.TXT
Insira a linha em branco abaixo de cada linha
sed '/regex/x; p; x; g;' arquivo.TXT
Insira a linha em branco acima e abaixo
sed = arquivo.txt | sed 'n; s/\ n/\ t/'
Linhas numéricas no arquivo.TXT
sed -e: a -e 's/^.\ 1,78 \ $/\
&/; Ta 'arquivo.TXT
Alinhe o texto nivelado à direita
sed -e: a -e 's/^.\ 1,77 \ $/ &/; ta '-e \
's/\ ( *\) \ 1/\ 1/' arquivo.TXT
Alinhe o centro de texto

Conclusão

Isso é apenas uma parte do que pode ser informado sobre sed, mas esta série se entende como um guia prático, por isso esperamos que isso ajude você a descobrir o poder das ferramentas do Unix e se tornar mais eficiente em seu trabalho.

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Coisas para instalar no Ubuntu 22.04
  • Ouça sua estação de rádio favorita com um único comando…
  • Sistema Linux Hung? Como escapar para a linha de comando e…
  • Ubuntu 20.04 Guia
  • Mastering Bash Script Loops