Exemplos do uso do Comando SED com Expressões Regulares
Índice:
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, osed
grava sua saída na saída padrão. Esta opção informa aosed
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 doSEARCH_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
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 sedO MSN aumentou sua participação no mercado de buscas nos EUA em julho, enquanto o MSN foi o maior perdedor O Google continuou a conquistar participação de mercado de buscas nos EUA em um ritmo recorde em julho, com o MSN, da Microsoft, como o maior perdedor no último ano e meio, segundo dados da Hitwise. O Google respondeu por 70,77 por cento de todas as consultas de mecanismos de pesquisa on-line nos EUA durante as quatro semanas que terminam em 26 de julho, disse a Hitwise na terça-feira. A ci
A busca MSN da Microsoft, em contraste, levou o pior atingiu nos últimos dezenove meses. O MSN representou apenas 5,36% de todas as buscas nos EUA em julho, ante 8,79% no mesmo mês do ano passado e quase metade dos 10,35% que o MSN detinha em janeiro de 2007.
A liderança inicial do Bing sobre o Yahoo não é um indicativo de como se sairá em longo prazo, dizem analistas O Bing, da Microsoft, ultrapassou o Yahoo Search em apenas quatro dias de lançamento, segundo a StatCounter, empresa de análise da Web, mas é cedo demais para dizer até que ponto o novo mecanismo de busca se comportará no longo prazo. tornou-se o segundo maior mecanismo de buscas nos EUA e no mundo, com 16,28 por cento de buscas nos 10,22 por cento do Yahoo nos EUA e 5,62 por cento no B
[Mais leitura: Os melhores serviços de streaming de TV]
Infosys adquire a empresa de BPO nos negócios de BPO da Infosys nos EUA para adquirir uma empresa de BPO nos EUA; focada no mercado de seguros e serviços financeiros
A Infosys BPO, subsidiária de terceirização de processos de negócios (BPO) da Infosys Technologies, disse na quinta-feira que assinou um acordo definitivo para adquirir todos os interesses pendentes da McCamish Systems. A empresa de BPO em Atlanta, Geórgia, concentrou-se no mercado de seguros e serviços financeiros.