Encontre e substitua o texto em um arquivo usando comandos

396

Como posso encontrar e substituir palavras específicas em um arquivo de texto usando a linha de comando?

    
por Jon Doe 07.01.2011 / 05:10

6 respostas

653
sed -i 's/original/new/g' file.txt

Explicação:

  • sed = EDitor de fluxo
  • -i = no local (ou seja, salvar de volta no arquivo original)
  • A string de comando:

    • s = o comando substituto
    • original = uma expressão regular que descreve a palavra a ser substituída (ou apenas a própria palavra)
    • new = o texto para substituí-lo por
    • g = global (isto é, substitua tudo e não apenas a primeira ocorrência)
  • file.txt = o nome do arquivo

por cscarney 07.01.2011 / 05:23
26

Existem várias maneiras diferentes de fazer isso. Um está usando sed e Regex. O SED é um editor de fluxo para filtrar e transformar texto. Um exemplo é o seguinte:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

Outra maneira que pode fazer mais sentido do que < strin e > strout é com canos!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog
    
por Marco Ceppi 07.01.2011 / 05:26
14

Você pode usar o Vim no modo Ex:

ex -sc '%s/OLD/NEW/g|x' file
  1. % seleciona todas as linhas

  2. s substituto

  3. g substitua todas as ocorrências em cada linha

  4. x escreve se foram feitas alterações (elas têm) e sai

por Steven Penny 16.04.2016 / 20:36
13

Através do comando gsub do awk,

awk '{gsub(/pattern/,"replacement")}' file

Exemplo:

awk '{gsub(/1/,"0");}' file

No exemplo acima, todos os 1's são substituídos por 0, independentemente da coluna em que se localizou.

Se você quiser fazer uma substituição em uma coluna específica, faça assim,

awk '{gsub(/pattern/,"replacement",column_number)}' file

Exemplo:

awk '{gsub(/1/,"0",);}' file

Substitui 1 por 0 apenas na coluna 1.

Através do Perl,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar
    
por Avinash Raj 02.07.2014 / 14:59
11

Existem várias maneiras de conseguir isso. Dependendo da complexidade do que se tenta alcançar com a substituição de strings e dependendo das ferramentas com as quais o usuário está familiarizado, alguns métodos podem ser preferidos mais que outros.

Nesta resposta, estou usando o arquivo input.txt simples, que você pode usar para testar todos os exemplos fornecidos aqui. O conteúdo do arquivo:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

BASH

O Bash não é realmente destinado ao processamento de texto, mas substituições simples podem ser feitas através da expansão de parâmetros , em particular aqui podemos usar estrutura simples ${parameter/old_string/new_string} .

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

Este pequeno script não substitui o local, o que significa que você teria que salvar um novo texto em um novo arquivo e se livrar do arquivo antigo, ou mv new.txt old.txt

Nota: se você está curioso para saber porque o while IFS= read -r ; do ... done < input.txt é usado, é basicamente a maneira de o shell ler o arquivo linha por linha. Veja este para referência.

AWK

O AWK, sendo um utilitário de processamento de texto, é bastante apropriado para essa tarefa. Ele pode fazer substituições simples e muito mais avançadas com base nas expressões regulares . Ele fornece duas funções: sub() e gsub() . O primeiro substitui apenas a primeira ocorrência, enquanto o segundo substitui as ocorrências em toda a cadeia. Por exemplo, se tivermos a string one potato two potato , esse seria o resultado:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 

O AWK pode usar um arquivo de entrada como argumento, portanto, fazer as mesmas coisas com input.txt seria fácil:

awk '{sub(/blue/,"azure")}1' input.txt

Dependendo da versão do AWK que você tem, ele pode ou não ter uma edição no local, portanto, a prática usual é salvar e substituir o novo texto. Por exemplo, algo assim:

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

SED

Sed é um editor de linhas. Ele também usa expressões regulares, mas para substituições simples é suficiente:

sed 's/blue/azure/' input.txt

O que é bom nessa ferramenta é que ela possui uma edição no local, que você pode ativar com -i flag.

Perl

Perl é outra ferramenta que é frequentemente usada para processamento de texto, mas é uma linguagem de propósito geral e é usada em redes, administração de sistemas, aplicativos de desktop e muitos outros lugares. Ele emprestou muitos conceitos / recursos de outras linguagens, como C, sed, awk e outros. A substituição simples pode ser feita da seguinte forma:

perl -pe 's/blue/azure/' input.txt

Como sed, o perl também tem o sinalizador -i.

Python

Esta linguagem é muito versátil e também é usada em uma ampla variedade de aplicativos. Ele tem muitas funções para trabalhar com strings, entre as quais replace() , então se você tem uma variável como var="Hello World" , você pode fazer var.replace("Hello","Good Morning")

Uma maneira simples de ler arquivos e substituir strings seria:

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

Com o Python, no entanto, você também precisa gerar um novo arquivo, o que também pode ser feito dentro do próprio script. Por exemplo, aqui está uma simples:

#!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])

Este script deve ser chamado com input.txt como argumento de linha de comando.

O Python também pode ter expressões regulares, em particular, há re module, que tem re.sub() function, que pode ser usado para substituições mais avançadas.

    
por Sergiy Kolodyazhnyy 03.02.2017 / 08:49
4

sed é a s tream ed itor , em que você pode usar | (pipe) para enviar streams padrão (STDIN e STDOUT especificamente) através de sed e alterá-los programaticamente no voar, tornando-se uma ferramenta útil na tradição da filosofia Unix; mas também pode editar arquivos diretamente, usando o parâmetro -i mencionado abaixo.
Considere o seguinte :

sed -i -e 's/few/asd/g' hello.txt

s/ é usado para s ubstitute a expressão encontrada few com asd :

  

Os poucos, os bravos.

     

O asd, o bravo.

/g significa "global", significando fazer isso para toda a linha. Se você deixar o /g (com s/few/asd/ , sempre precisa haver três barras, não importa o que) e few aparecer duas vezes na mesma linha, somente o primeiro few será alterado para asd :

  

Os poucos homens, as poucas mulheres, os bravos.

     

Os homens do asd, as poucas mulheres, os bravos.

Isso é útil em algumas circunstâncias, como alterar caracteres especiais no início das linhas (por exemplo, substituir os símbolos de maior que algumas pessoas usam para citar material anterior em encadeamentos de e-mail com uma guia horizontal, deixando uma inequação algébrica mais tarde na linha intocada), mas no seu exemplo onde você especifica que em qualquer lugar few ocorre, ele deve ser substituído, certifique-se de ter esse /g .

As duas opções a seguir (sinalizadores) são combinadas em uma só, -ie :

A opção

-i é usada para editar i n place no arquivo hello.txt .

A opção

-e indica o comando e xpression / a executar, neste caso s/ .

Nota: é importante que você use -i -e para pesquisar / substituir. Se você usar -ie , crie um backup de todos os arquivos com a letra 'e' anexada.

    
por Chaminda Bandara 23.11.2017 / 10:00