Welcome to Our Website

The Basics of Using the Sed Stream Editor to Manipulate Text in Linux

Introduction

The sed command, short for stream editor, performs editing operations on text coming from standard input or a file. sed edita linha a linha e de uma forma não interativa.

isto significa que você toma todas as decisões de edição à medida que chama o comando, e sed executa as instruções automaticamente., Isto pode parecer confuso ou não intuitivo, mas é uma maneira muito poderosa e rápida de transformar texto, especialmente como parte de um script ou fluxo de trabalho automatizado.

Este tutorial irá cobrir algumas operações básicas e apresentá-lo à sintaxe necessária para operar este editor. Quase de certeza que nunca irá substituir o seu editor de texto regular por sed, mas provavelmente irá tornar-se uma adição bem-vinda à sua caixa de ferramentas de edição de texto.

Nota: Este tutorial usa a versão GNU de sed encontrada no Ubuntu e outros sistemas operacionais Linux., Se você estiver usando macOS, você terá a versão BSD que tem diferentes opções e argumentos. Você pode instalar a versão GNU de sedcom o Homebrew usandobrew install gnu-sed.

lance um Terminal interativo!

utilização básica

sed opera num fluxo de texto que lê a partir de um ficheiro de texto ou de uma entrada padrão (STDIN). Isto significa que você pode enviar o resultado de outro comando diretamente para o sed para edição, ou você pode trabalhar em um arquivo que você já criou.,

Você também deve estar ciente de que sed produz tudo para fora padrão (STDOUT) por padrão. Isso significa que, a menos que redirecionado, sed irá imprimir sua saída para a tela em vez de salvá-lo em um arquivo.

a utilização básica é:

  • sed commands

neste tutorial, você vai usar uma cópia da Licença de Software BSD para experimentar com sed., No Ubuntu, execute os seguintes comandos para copiar a licença BSD arquivo para o seu diretório home para que você possa trabalhar com ele:

  • cd
  • cp /usr/share/common-licenses/BSD .

Se você não tem uma cópia local da licença BSD, criar um você mesmo com este comando:

  • cat << 'EOF' > BSD
  • Copyright (c) The Regents of the University of California.
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • 1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • 3. Neither the name of the University nor the names of its contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  • SUCH DAMAGE.
  • EOF

Vamos usar sed para exibir o conteúdo da licença BSD arquivo. sed envia seus resultados para a tela por padrão, o que significa que você pode usá-lo como um leitor de arquivos, passando-o sem comandos de edição., Tenta executar o seguinte comando:

  • sed '' BSD

Você vai ver a licença BSD exibida na tela:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......

As aspas simples contêm os comandos de edição de passar para o sed. Neste caso, você passou por nada, então sed imprimiu cada linha que recebeu para a saída padrão.

sed pode usar uma entrada padrão em vez de um ficheiro., Canalizar a saída de cat comando sed para produzir o mesmo resultado:

  • cat BSD | sed ''

Você verá a saída do arquivo:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

Como você pode ver, você pode operar em arquivos ou fluxos de texto, como os produzidos quando a tubulação de saída com tubo (|) personagem, tão facilmente.

Linhas de Impressão

No exemplo anterior, você viu que a entrada transmitida em sed sem quaisquer operações imprimir os resultados diretamente para a saída padrão.,

Vamos explorar sed‘s explícita print comando que você especificar usando o p caractere entre aspas simples.

Execute o seguinte comando:

  • sed 'p' BSD

Você vai ver cada linha do BSD arquivo impresso duas vezes:

Output
Copyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .

sed automaticamente imprime cada linha por padrão, e então, o que você disse a ele para imprimir linhas explicitamente com o “p” de comando, de modo a obter cada linha impressa duas vezes.,

Se você examinar o resultado de perto, você verá que ele tem a primeira linha duas vezes, seguido pela segunda linha duas vezes, etc, o que lhe diz que sed opera em dados linha por linha. Ele lê uma linha, opera nela, e produz o texto resultante antes de repetir o processo na próxima linha.

Você pode limpar os resultados, passando o -n opção sed, que suprime a impressão automática:

  • sed -n 'p' BSD
Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

Estamos agora de volta para a impressão de cada linha de uma vez.,

os exemplos até agora dificilmente podem ser considerados edição (a menos que você quisesse imprimir cada linha duas vezes…). Em seguida, você vai explorar como sed pode modificar a saída direcionando secções específicas dos dados de texto.

usando os intervalos de endereços

os endereços permitem-lhe atingir partes específicas de um fluxo de texto. Você pode especificar uma linha específica ou mesmo uma gama de linhas.

Let’s have sed print the first line of the file., Execute o seguinte comando:

  • sed -n '1p' BSD

A primeira linha imprime na tela:

Output
Copyright (c) The Regents of the University of California.

colocando o número 1 antes que o comando de impressão, você disse sed o número de linha para funcionar. Você pode apenas como facilmente imprimir cinco linhas (não esqueça o “-n”):

  • sed -n '1,5p' BSD

Você verá essa saída:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions

Você acabou de dar um intervalo de endereços sed., Se você der sed um endereço, ele só irá executar os comandos que seguem nessas linhas. Neste exemplo, você disse ao sed para imprimir a linha 1 através da linha 5. Você poderia ter especificado isso de uma forma diferente, dando o primeiro endereço e, em seguida, usando um offset para dizer sed quantas linhas adicionais para viagem, como este:

  • sed -n '1,+4p' BSD

Isto irá resultar em que a mesma saída, porque você disse sed para iniciar na linha 1 e, em seguida, operar nos próximos 4 linhas bem.,

Se quiser imprimir todas as outras linhas, indique o intervalo a seguir ao carácter

. O seguinte comando imprime cada linhaBSDarquivo, começando com a linha 1:

  • sed -n '1~2p' BSD

Aqui está a saída, você vai ver:

Output
Copyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .

Você pode usar sed para excluir o texto de saída bem.,

a remoção do texto

pode efectuar a remoção do texto onde estava previamente a indicar a impressão do texto, alterando o comando p para o comando d.

neste caso, você não precisa mais do comando -nporquesed irá imprimir tudo o que não for apagado. Isto vai ajudar-te a ver o que se passa.,

Modificar o último comando da seção anterior para torná-lo
excluir todas as linhas começando com o primeiro:

  • sed '1~2d' BSD

O resultado é que você pode ver cada linha que você não foi dada última hora:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

é importante notar aqui que o nosso arquivo de origem não está sendo afetado. Ainda está intacto. As edições são de saída para o nosso ecrã.,

Se queremos salvar o nosso edições, podemos redirecionar a saída padrão para um arquivo, como por exemplo:

  • sed '1~2d' BSD > everyother.txt

Agora abra o arquivo com cat:

  • cat everyother.txt

Você ver a mesma saída que você viu na tela anteriormente:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

sed comando não edite o arquivo de origem por padrão, mas você pode alterar esse comportamento, passando o -i opção, que significa “realizar edições no local.”Isto irá alterar o ficheiro de código.,

Aviso: Se usar o -i switch irá sobrepor o ficheiro original, por isso deverá usar isto com cuidado. Execute as operações sem o id

mude primeiro e depois execute o comando de novo com-iuma vez que tenha o que deseja, crie uma cópia de segurança do ficheiro original ou redireccione o resultado para um ficheiro. É muito fácil alterar acidentalmente o arquivo original com o botão-i.

Let’s try it by editing the everyother.txt file you just created, in-place., Vamos reduzir ainda mais o ficheiro, apagando todas as outras linhas
de novo:

  • sed -i '1~2d' everyother.txt

Se usar cat para mostrar o ficheiro com cat everyother.txt, irá ver que o ficheiro foi editado.

a opção -i pode ser perigosa. Felizmente, sed dá-Lhe a capacidade de criar um arquivo de backup antes da edição.,

para criar um ficheiro de salvaguarda antes de editar, adicione a extensão de salvaguarda directamente após a opção “-i”:

  • sed -i.bak '1~2d' everyother.txt

isto cria um ficheiro de salvaguarda com a extensão

, e depois edita o ficheiro original no local.

em seguida, você vai olhar para como usar sed para realizar operações de busca e substituição.

substituir texto

talvez o uso mais conhecido para sed esteja substituindo texto., sed pode procurar por padrões de texto usando expressões regulares, e então substituir o texto encontrado por outra coisa.

pode aprender mais sobre expressões regulares se seguir as expressões regulares Grep para procurar por padrões de texto no Linux.

na sua forma mais básica, você pode mudar uma palavra para outra palavra usando a seguinte sintaxe:

's/old_word/new_word/'

o s é o comando substituto. As três barras (/) são usadas para separar os diferentes campos de texto., Você pode usar outros caracteres para delimitar os campos se for mais útil.

por exemplo, se você estava tentando mudar o nome de um site, usar outro delimitador seria útil, uma vez que os URLs contêm traços.

Execute o seguinte comando para imprimir um URL com echo e modificá-lo com sed, usando o caractere de sublinhado (_) caracter como delimitador:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'

Este substitui com/index com org/home., O resultado mostra o URL modificado:

Output

Do not forget the final delimiter, or sed will complain. If you ran this command:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home'

você veria este resultado:

Output
sed: -e expression #1, char 20: unterminated `s' command

vamos criar um novo ficheiro para praticar algumas substituições. Execute o seguinte comando para criar um novo arquivo de texto chamado song.txt:

  • echo "this is the song that never ends
  • yes, it goes on and on, my friend
  • some people started singing it
  • not knowing what it was
  • and they'll continue singing it forever
  • just because..." > song.txt

Agora, vamos substituir a expressão on com forward. Use o seguinte comando:

  • sed 's/on/forward/' song.txt

o resultado é parecido com este:

Output
this is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

pode ver algumas coisas notáveis aqui., Primeiro, é quesed padrões substituídos, Não palavras. The on within is changed to forward.

outra coisa A observar é que, na linha 2, o segundo on não foi alterado para forward.

isto ocorre porque, por padrão, o comando s opera na primeira partida de uma linha e, em seguida, move-se para a próxima linha., Para fazer sed substituir cada instância de on em vez de apenas o primeiro em cada linha, você deve passar uma bandeira opcional para o comando substituto.

Fornecer o g sinalizador para o comando substituir, colocando-a depois que o conjunto de substituição:

  • sed 's/on/forward/g' song.txt

Você verá essa saída:

Output
this is the sforwardg that never endsyes, it goes forward and forward, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

Agora, o substituto de comando muda a cada instância.,

Se você só queria mudar a segunda instância de “no”, que sed encontra em cada linha, em seguida, você deve usar o número de 2 em vez de g:

  • sed 's/on/forward/2' song.txt

Neste momento as outras linhas são inalterados, como eles não têm uma segunda ocorrência:

Output
this is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...

Se você só quer ver quais linhas foram substituídas, use o -n opção novamente para suprimir a impressão automática.,

pode então passar a opçãop para o comando substituto para imprimir as linhas onde a substituição ocorreu.

  • sed -n 's/on/forward/2p' song.txt

A linha que mudou imprime na tela:

Output
yes, it goes on and forward, my friend

Como você pode ver, você pode combinar as bandeiras no final do comando.

Se quiser que o processo de pesquisa ignore case, pode passar-lhe a bandeira “i”.,

  • sed 's/SINGING/saying/i' song.txt

Aqui está a saída, você vai ver:

Output
this is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...

a Substituição e encaminhamento de Correspondência de Texto

Se você deseja encontrar padrões mais complexos com expressões regulares, você tem um número de diferentes métodos de referência a correspondência por padrão no texto de substituição.,

Por exemplo, para corresponder a partir do início da linha at, use o seguinte comando:

  • sed 's/^.*at/REPLACED/' song.txt

Você vai ver este resultado:

Output
REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...

Você pode ver que a expressão universal correspondências a partir do início da linha até a última instância de at.

Uma vez que não sabe a Frase exacta que irá corresponder na sequência de pesquisa, poderá usar o carácter & para representar o texto correspondente na sequência de substituição.,

Vamos colocar entre parênteses o texto correspondente:

  • sed 's/^.*at/(&)/' song.txt

Você verá essa saída:

Output
(this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...

de Uma forma mais flexível de referência de correspondência de texto é usar escapou parênteses para agrupar seções de texto correspondente.

cada grupo de texto de pesquisa marcado com parêntesis pode ser referenciado por um número de referência escapado. Por exemplo, o primeiro parênteses grupo pode ser referenciado com \1, o segundo com \2 e assim por diante.,

neste exemplo, vamos alternar as duas primeiras palavras de cada linha:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

Você verá essa saída:

Output
is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...

Como você pode ver, os resultados não são perfeitos. Por exemplo, a segunda linha salta a primeira palavra porque tem um personagem não listado em nosso conjunto de caracteres. Similarmente, ele tratou they'll como duas palavras na quinta linha.

Vamos melhorar a expressão regular para ser mais preciso:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

Você verá essa saída:

Output
is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just

Este é muito melhor do que da última vez., Isto agrupa pontuação com a palavra associada.

Notice how we repeat the expression inside the parentheses (once without the * character, and then once with it). Isto porque o caractere * corresponde ao conjunto de caracteres que vem antes dele zero ou mais vezes. Isto significa que a correspondência com o wildcard seria considerada uma “correspondência” mesmo que o padrão não seja encontrado.

para garantir que sed encontra o texto pelo menos uma vez, tem de o corresponder uma vez sem a placa especial antes de utilizar a placa especial.,

Conclusion

In this tutorial you explored the sed command. Imprimiu linhas específicas do ficheiro, procurou por texto, linhas apagadas, reescreveu o ficheiro original e usou expressões regulares para substituir o texto. Você deve ser capaz de ver já como você pode rapidamente transformar um documento de texto usando comandos sed devidamente construídos.

no próximo artigo desta série, você irá explorar algumas características mais avançadas.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *