ao trabalhar com arquivos de texto, você muitas vezes precisará encontrar e substituir textos de texto em um ou mais arquivos.
sed
é um editor de fluxo. Ele pode realizar manipulação de texto básico em arquivos e fluxos de entrada, como pipelines. Com sed
, você pode procurar, encontrar e substituir, inserir e excluir palavras e linhas. Suporta expressões regulares básicas e extendidas que lhe permitem corresponder a padrões complexos.,
neste artigo, vamos falar sobre como encontrar e substituir strings com sed
. Também lhe mostraremos como realizar uma busca recursiva e substituir.
encontre e substitua a cadeia por sed #
Existem várias versões de sed
, com algumas diferenças funcionais entre eles. macOS usa a versão BSD, enquanto a maioria das distribuições Linux vêm com GNU sed
pré-instalado por padrão. Usaremos a versão GNU.,
A forma geral de pesquisa e substituição de texto, usando o sed
assume a seguinte forma:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– Por padrão,sed
grava a saída para a saída padrão. Esta opção diz ased
para editar os ficheiros no local. Se for fornecida uma extensão (ex-I. bak), é criada uma cópia de segurança do ficheiro original. -
s
– o comando substituto, provavelmente o comando mais usado no sed. -
/ / /
– carácter delimitador., Pode ser qualquer personagem, mas geralmente o caractere slash (/
) é usado. -
SEARCH_REGEX
– cadeia Normal ou uma expressão regular a procurar. -
REPLACEMENT
– a cadeia de substituição. -
g
– bandeira de substituição Global. Por padrão,sed
lê a linha de arquivo e altera apenas a primeira ocorrência doSEARCH_REGEX
em uma linha. Quando a bandeira de substituição é fornecida, todas as ocorrências são substituídas., - – o nome do ficheiro no qual deseja executar o comando.
é uma boa prática colocar aspas em torno do argumento para que os meta-caracteres shell não se expandam.
Let’s see how we can use the sed
command to search and replace text in files with some of its most commonly used options and flags.
para fins de demonstração, vamos usar o seguinte ficheiro:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Se g
bandeira é omitido, apenas a primeira ocorrência da seqüência de caracteres de pesquisa em cada linha é substituído:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Com a substituição global sinalizador sed
substitui todas as ocorrências do padrão de pesquisa:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Como você pode ter notado, a subseqüência de caracteres foo
dentro de foobar
string também é substituído no exemplo anterior., Se este não é o comportamento desejado, use a expressão limite de palavras (\b
) em ambas as extremidades da cadeia de busca. Isto garante que as palavras parciais não são correspondidas.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
Para fazer a correspondência de padrão de maiúsculas e minúsculas, use o I
bandeira., No exemplo abaixo estamos usando o g
e I
flags:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Se você deseja localizar e substituir uma seqüência de caracteres que contém o caractere delimitador (/
) você vai precisar usar a barra invertida (\
) para escapar da barra. Por exemplo, para substituir /bin/bash
com /usr/bin/zsh
você usaria
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
O mais fácil e muito mais legível opção é usar outro delimitador de caracteres., A maioria das pessoas usa a barra vertical (|
) ou dois pontos (:
), mas você pode usar qualquer outro caractere:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
Você também pode usar expressões regulares. Por exemplo, para procurar todos os números de 3 dígitos e substituí-los com a cadeia de caracteres number
você usaria:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Outra funcionalidade útil do sed é que você pode usar o caractere e comercial &
o que corresponde a correspondência por padrão., O personagem pode ser usado várias vezes.
Por exemplo, se você quiser adicionar as chaves {}
ao redor de cada número de 3 dígitos, tipo:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
por Último, mas não menos importante, é sempre uma boa idéia fazer um backup quando a edição de um arquivo com sed
. Para fazer isso, basta fornecer uma extensão para o arquivo de backup para a opção -i
., Por exemplo, para editar o file.txt
e salvar o arquivo original file.txt.bak
você usaria:
sed -i.bak 's/foo/linux/g' file.txt
certifique-se de que o backup é criado, lista os arquivos com o ls
comando:
ls
file.txt file.txt.bak
Recursiva Localizar e Substituir #
às Vezes você pode querer recursivamente os diretórios de pesquisa para arquivos que contenham uma cadeia de caracteres e substituir a seqüência de caracteres em todos os arquivos., Isso pode ser feito usando os comandos como find
ou grep
recursivamente encontrar arquivos no diretório e tubulações, os nomes de arquivo para sed
.
o seguinte comando irá procurar recursivamente por ficheiros na pasta de trabalho actual e passar os nomes dos ficheiros para sed
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
Para evitar problemas com os arquivos que contém espaço em seus nomes, use o -print0
opção, que informa find
para imprimir o nome do arquivo, seguido por um caractere nulo e canalizar a saída para sed
uso de xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Para excluir um diretório, use o -not -path
opção.,arting com ponto (.
), use:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Se você deseja procurar e substituir apenas o texto em arquivos com uma extensão específica, você irá utilizar:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Outra opção é usar o grep
comando para recursivamente localizar todos os arquivos que contenham o padrão da procura e, em seguida, tubo de nomes de ficheiros para sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Conclusão #
Embora possa parecer complicado e complexo, em primeiro lugar, busca e substituição de texto em arquivos com sed
é muito simples.,
para saber mais sobre sed
comandos, opções e bandeiras, visite o manual sed GNU e o tutorial sed Grymoire .
Leave a Reply