Bash: localizar e substituir cadeias de texto

2

Eu percebi que isso seria fácil, mas estou negligenciando algo simples:

Eu tenho um arquivo de texto chamado test . Ele contém, por exemplo, a string Alfred Hitchcock . Eu quero substituir isso com Alfred\ Hitchcock .

Eu imaginei que isso funcionaria:

grep -r1 ' ' /path/to/test | xargs sed -i 's/ /\ /g'

Mas isso me diz:

sed: can't read Alfred: No such file or directory
sed: can't read Hitchcock: No such file or directory

Não tenho certeza do que está acontecendo. Qualquer ajuda seria ótima, obrigado.

    
por Conor Taylor 10.02.2013 / 02:05

3 respostas

7

Você não precisa de grep :

sed -i 's/ /\ /g' /path/to/test

Isso irá escapar todos os espaços no arquivo. Para escapar apenas de algumas cordas, veja a resposta do Guru.

Agora, se você quiser fazer isso em todos os arquivos que contenham um caractere de espaço em um determinado diretório:

grep -rl ' ' /path/to/test/dir | xargs sed -i 's/ /\ /g'

que é, agora eu percebo, idêntico à sua linha de comando, exceto o caractere após -r , que deve ser um minúsculo L .

(Nota: estou assumindo que as ferramentas GNU estão sendo usadas.)

    
por 10.02.2013 / 02:17
2

Um caminho:

sed -i 's/Alfred Hitchcock/Alfred\ Hitchcock/' /path/to/test
    
por 10.02.2013 / 02:17
1

Tente executar o comando grep sozinho para ver o que está acontecendo.

Vai imprimir algo como

/path/to/test/test:Alfred Hitchcock

Ao canalizar isso para xargs, ele tentará executar

sed -i 's/ /\ /g' /path/to/test/test:Alfred
sed -i 's/ /\ /g' Hitchcock
    
por 10.02.2013 / 02:18