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 sed
com o Homebrew usandobrew install gnu-sed
.
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:
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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 linhaBSD
arquivo, começando com a linha 1:
- sed -n '1~2p' BSD
Aqui está a saída, você vai ver:
OutputCopyright (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 -n
porquesed
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:
OutputAll 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:
OutputAll 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-i
uma 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:
Outputsed: -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:
Outputthis 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:
Outputthis 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:
Outputthis 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:
Outputyes, 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:
Outputthis 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.