Introdução
- 4785
- 523
- Randal Kuhlman
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ê \ | 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' \ | Exclua todas as linhas em branco à direita |
sed -e: a -e '/\\ $/n; S/\\\\ n //; ta '\ | 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 |/; | 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] \+\) \\ | 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; \ | Substitua apenas entre "de" e "até" |
sed '/endNotes:/, $ s/schaff/herzog/g; \ | 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; \ | 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 \\ | 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 \ | 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' \ | Uma substituição da cauda |
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D '\ | Uma substituição uniq |
sed '$!N; s/^\ (.*\) \ n \ 1 $/\ 1/; \ | 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; '\ | 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 '\ | 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 \ | Auto-explicativo |
sed -e '/^$/,/^end/s/hills/\ | 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@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\ | Ordem reversa dos itens na última linha de caminho.TXT |
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\ | 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 \ $/\ | Alinhe o texto nivelado à direita |
sed -e: a -e 's/^.\ 1,77 \ $/ &/; ta '-e \ | 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