Android

Como usar o sed para encontrar e substituir as strings nos arquivos

Exemplos do uso do Comando SED com Expressões Regulares

Exemplos do uso do Comando SED com Expressões Regulares

Índice:

Anonim

Com bastante frequência, ao trabalhar com arquivos de texto, você precisará localizar e substituir cadeias de texto em um ou mais arquivos.

sed é um editor de moda. Ele pode executar manipulação básica de texto em arquivos e fluxos de entrada, como pipelines. Com o sed você pode pesquisar, localizar e substituir, inserir e excluir palavras e linhas. Ele suporta expressões regulares básicas e estendidas que permitem combinar padrões complexos.

, falaremos sobre como encontrar e substituir strings por sed . Também mostraremos como executar uma pesquisa recursiva e substituir.

Encontre e substitua String por sed

Existem várias versões do sed , com algumas diferenças funcionais entre elas. O macOS usa a versão BSD e a maioria das distribuições Linux vem com o GNU sed pré-instalado por padrão. Usaremos a versão GNU.

A forma geral de pesquisar e substituir texto usando sed assume o seguinte formato:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Por padrão, o sed grava sua saída na saída padrão. Esta opção informa ao sed para editar arquivos no local. Se uma extensão for fornecida (ex-i.bak), será criado um backup do arquivo original. s - O comando substituto, provavelmente o comando mais usado no sed. / / / - Caractere delimitador. Pode ser qualquer caractere, mas geralmente o caractere de barra ( / ) é usado. SEARCH_REGEX - String normal ou uma expressão regular para procurar. REPLACEMENT - A sequência de substituição. g - Sinalizador de substituição global. Por padrão, sed lê o arquivo linha por linha e altera apenas a primeira ocorrência do SEARCH_REGEX em uma linha. Quando o sinalizador de substituição é fornecido, todas as ocorrências serão substituídas. INPUTFILE - O nome do arquivo no qual você deseja executar o comando.

É uma boa prática colocar aspas no argumento para que os metacaracteres do shell não se expandam.

Vamos ver exemplos de como usar o comando sed para pesquisar e substituir texto em arquivos por algumas das opções e sinalizadores mais usados.

Para fins de demonstração, usaremos o seguinte arquivo:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Com o sinalizador de substituição global, sed substitui todas as ocorrências do padrão de pesquisa:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Como você deve ter notado, no exemplo anterior, a substring foo dentro da string foobar também é substituída. Se esse não for o comportamento desejado, use a expressão de limite de palavras ( \b ) nas duas extremidades da string de pesquisa. Isso garante que as palavras parciais não sejam correspondidas.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Para fazer o padrão corresponder a maiúsculas e minúsculas, use o sinalizador I No exemplo abaixo, estamos usando os sinalizadores g e I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

A opção mais fácil e muito mais legível é usar outro caractere delimitador. 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 pesquisar todos os números de 3 dígitos e substituí-los pelo number da string que você usaria:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Outra característica útil do sed é que você pode usar o caractere & comercial & que corresponde ao padrão correspondente. O personagem pode ser usado várias vezes.

Por exemplo, se você deseja adicionar chaves {} torno de cada número de 3 dígitos, digite:

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 ideia fazer um backup ao editar um arquivo com o sed . Para fazer isso, basta fornecer uma extensão para a opção -i . Por exemplo, para editar o file.txt e salvar o arquivo original como file.txt.bak você usaria:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Localizar e substituir recursivamente

Às vezes, você deseja procurar recursivamente nos diretórios arquivos que contenham uma sequência e substituí-la em todos os arquivos. Isso pode ser feito usando comandos como find ou grep para localizar recursivamente arquivos no diretório e canalizar os nomes dos arquivos para sed .

O comando a seguir procurará recursivamente os arquivos no diretório de trabalho atual e passará os nomes dos arquivos para sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Para evitar problemas com arquivos que contenham espaço em seus nomes, use a opção -print0 que informa find para imprimir o nome do arquivo, seguido por um caractere nulo e canalize a saída para sed usando xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Para excluir um diretório, use a opção -not -path . Por exemplo, se você estiver substituindo uma string no seu repositório git local para excluir todos os arquivos que começam com ponto ( . ), Use:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Outra opção é usar o comando grep para localizar recursivamente todos os arquivos que contêm o padrão de pesquisa e canalizar os nomes de arquivos para sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Conclusão

Embora possa parecer complicado e complexo, a princípio, pesquisar e substituir texto em arquivos pelo sed é muito simples.

Para saber mais sobre os comandos, opções e sinalizadores sed, visite o manual do GNU sed e o tutorial do Grymoire sed. Se você tiver alguma dúvida ou comentário, fique à vontade para deixar um comentário.

terminal sed