使用 sed 查找并替换多个文件中的字符串

使用 sed 查找并替换多个文件中的字符串

我正在尝试将包含一组已知字符的文件列表传递给 sed 进行查找和替换。

对于包含多个 .xml 文件的目录:

ls -la

file1.xml
file2.xml
file3.xml

每个都包含一个匹配的字符串:

grep -i foo *

file1.xml <foo/>
file2.xml <foo/>
file3.xml <foo/>

使用 for 循环将 foo 替换为 bar:

for f in *.xml; do ls | sed -i "s|foo|bar|g" ; done

返回:

sed: no input files
sed: no input files
sed: no input files

我已经找到了一个可行的替代方案,所以这主要是为了我自己的启发。

find /dir/ -name '*.xml' -exec sed -i "s|foo|bar|g" {} \;

答案1

你的循环有缺陷for。删除该ls命令,并将$f变量添加为 的参数,这将就地sed -i编辑每个变量:filename.xml

for f in *.xml; do sed -i "s|foo|bar|g" "$f"; done

答案2

请注意,在 GNU sed 中,您也可以就地编辑多个文件。所以你的任务就减少为:

sed -i -se 's|foo|bar|g' *.xml

-s for --separatesed执行此操作的选项。

答案3

sed 期望输入路径作为参数。因此尝试如下构造:

 … | sed -i "…" /dev/stdin

使用文件作为参数会更容易,因为(未经测试):

sed -i "..." *.xml

相关内容