使用grep和sed管道中的tee将输出管道输出到终端和文件

时间:2015-09-17 21:59:25

标签: bash sed grep tee

我试图从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

要明确的是,我正在寻找一种解决方案,通过搜索和替换修改匹配的文件,然后输出修改后的文件'文件名到终端和日志文件。

3 个答案:

答案 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命令实际上不会修改的文件。

您可以对findexec执行相同的操作,但这是一个危险的工具。

答案 2 :(得分:0)

我差点忘了这件事。我最终在bash脚本中使用了for循环:

#!/bin/bash
for i in $( grep -Flr "string1" * ); do
    sed -i "s|string1|string2|g" $i
    echo $i
    echo $i >> ~/outputfile.txt
done

我正在使用垂直管道作为分隔符,因为我正在用大量的正斜杠替换URL路径。

谢谢你们的帮助。