我正在尝试将包含一组已知字符的文件列表传递给 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 --separate
是sed
执行此操作的选项。
答案3
sed 期望输入路径作为参数。因此尝试如下构造:
… | sed -i "…" /dev/stdin
使用文件作为参数会更容易,因为(未经测试):
sed -i "..." *.xml