我试图从grep和sed管道获取输出到终端和文本文件。
无论
grep -Filr "string1" * 2>&1 | tee ~/outputfile.txt | sed -i "s|string1|string2|g"
,也不
grep -Filr "string1" * | sed -i "s|string1|string2|g" 2>&1 | tee ~/outputfile.txt
的工作。我得到了#sed:没有输入文件"去往终端所以sed没有得到正确的输入。我只想查看并写出一个文本文件,从搜索和替换中修改哪些文件。我知道使用find
代替grep
会更有效率,因为搜索不会进行两次,但我不确定如何使用{{1}输出文件名如果有搜索匹配,则显示{}}。{/ p>
编辑:
糟糕,我忘了在代码中加入find
。应该是:
sed
和
xargs
要明确的是,我正在寻找一种解决方案,通过搜索和替换修改匹配的文件,然后输出修改后的文件'文件名到终端和日志文件。
答案 0 :(得分:2)
-i
的{{1}}选项仅在sed
对文件进行操作时有用,而非标准输入。放下它,你的第一个选择是正确的。
答案 1 :(得分:2)
我使用循环:
for i in `grep -lr string1 *`; do sed -i . 's/string1/string2/g' $i; echo $i >> ~/outputfile.txt; done
我建议不要使用grep的'i'选项,因为它会匹配sed命令实际上不会修改的文件。
您可以对find
和exec
执行相同的操作,但这是一个危险的工具。
答案 2 :(得分:0)
#!/bin/bash
for i in $( grep -Flr "string1" * ); do
sed -i "s|string1|string2|g" $i
echo $i
echo $i >> ~/outputfile.txt
done
我正在使用垂直管道作为分隔符,因为我正在用大量的正斜杠替换URL路径。
谢谢你们的帮助。