Как ack-grep заменить строку из нескольких слов

1710
Bentley4

Следующая команда заменяет каждое вхождение слова fromв любом файле текущего каталога или его подкаталогов на to:

ack-grep -l --print0 --text from | xargs -0 -n 1 sed -i -e 's/from/to/g' 

Я получил это из этой темы.

Как заменить строку, включающую несколько слов вместо одного слова? Например, заменить laughing babiesна smiling little children.

Я попробовал следующее, но это не сработало:

ack-grep -l --print0 --text 'laughing babies' | xargs -0 -n 1 sed -i -e "s/'laughing babies'/'smiling little children'/g" ack-grep -l --print0 --text 'laughing babies' | xargs -0 -n 1 sed -i -e 's/"laughing babies"/"smiling little children"/g' 

Не знаю, имеет ли это значение, но я на связи Ubuntu 11.10.

3

1 ответ на вопрос

3
terdon

You actually don't need the quotes, sed can deal with spaces and the quotes are taken as being part of the pattern (unless you escape them). Just do this:

ack-grep -l --print0 --text 'laughing babies' | xargs -0 -n 1 sed -i -e 's/laughing babies/smiling little children/g' 

I don't see why you want the grep part though, you could just run sed directly on all files of the directory, sed is fast:

sed -i -e 's/laughing babies/smiling little children/g' * 
Потому что ack-grep опускает некоторые файлы, подобные тем, которые находятся в .git, при поиске. Но эту команду sed приятно знать, тем не менее, спасибо! Bentley4 11 лет назад 0