2013-11-08 24 views
0

Я пытаюсь запустить цикл for, который заменит строки в файлах, переданных в виде списка.while loop on list with spaces

Пример:

Filename1 

Filename2 

File name3 

File name4 

Мой текущий код:

for i in `grep -Rl 'OLD' *`; do                             
> perl -pe 's/OLD/NEW/g' -pi "$i" 
> done 

Can't open File: No such file or directory. 
Can't open name3: No such file or directory. 
Can't open File: No such file or directory. 
Can't open name3: No such file or directory. 
Can't open File: No such file or directory. 
Can't open name4: No such file or directory. 

Спасибо!

ответ

1

Для того, чтобы избежать слов расщеплению, вы можете сказать:

grep -Rl 'OLD' * | while read i; do 
    perl -pe 's/OLD/NEW/g' -pi "$i"; 
done 

или

while read i; do 
    perl -pe 's/OLD/NEW/g' -pi "$i"; 
done < <(grep -Rl 'OLD' *) 
+1

Это будет иметь проблемы с именами файлов, содержащими символ новой строки. (Но кто ставит новую строку в имени файла? Те же люди, которые помещают пробелы в имена файлов!) –

1

Попробуйте использовать xargs с sed

grep -Rl 'OLD' * -Z | xargs -0 sed -i 's/OLD/NEW/g' 

Обратите внимание на использование -Z варианта grep для завершения вывода с null, совместим с xargs -0. Это устранит проблему с пробелом в именах файлов.

0

Вы можете также использовать поиск, чтобы сделать это:

find -name 'File*' -exec sed -i 's,OLD,NEW,g' {} \;