Bash 带空格的列表上的while循环

Bash 带空格的列表上的while循环,bash,shell,while-loop,grep,Bash,Shell,While Loop,Grep,我正在尝试运行一个for循环,它将替换作为列表传递的文件中的字符串 例如: Filename1 Filename2 File name3 File name4 我目前的代码是: for i in `grep -Rl 'OLD' *`; do > perl -p

我正在尝试运行一个for循环,它将替换作为列表传递的文件中的字符串

例如:

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.

谢谢

为了避免分词,您可以说:

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

阅读时
;做
perl-pe's/OLD/NEW/g'-pi“$i”;

完成<尝试使用
xargs
sed

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

注意使用
grep
-Z
选项以null终止输出,与
xargs-0
兼容。这将克服文件名中的空白问题。

您也可以使用“查找”来完成此操作:

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

这将与包含换行符的文件名有关。(但谁在文件名中加了换行符?就是那些在文件名中加空格的人!)
find -name 'File*' -exec sed -i 's,OLD,NEW,g' {} \;