Replace 如何在搜索/替换文件中的字符串时避免临时文件

Replace 如何在搜索/替换文件中的字符串时避免临时文件,replace,grep,temporary,Replace,Grep,Temporary,我试图使用以下命令搜索和替换文件中的字符串: grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g' 问题是,它报告了无法打开临时文件$#^%$^$的错误:权限被拒绝 该命令是用sudo运行的,因此似乎临时文件是在执行grep命令时生成的,但是sed无法替换临时文件中的字符串,因为它正在被打开 我试图将文件类型指定为*.html,但仍然出现相同的错误: grep -rl oldtext *.html . | xargs sed -i 's

我试图使用以下命令搜索和替换文件中的字符串:

grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
问题是,它报告了无法打开临时文件$#^%$^$的错误:权限被拒绝

该命令是用sudo运行的,因此似乎临时文件是在执行grep命令时生成的,但是sed无法替换临时文件中的字符串,因为它正在被打开

我试图将文件类型指定为*.html,但仍然出现相同的错误:

grep -rl oldtext *.html . | xargs sed -i 's/oldtext/newtext/g'
我知道使用find可以避免此问题:

find ./ -type f -exec sed -i -e 's/oldstring/newstring/g' *.html {} \;

只是想知道如何使用grep命令避免这个问题。谢谢

sed正在创建一个临时文件,不管它是否直接从find调用。grep的
-r
选项是GNU人员引入的一些语法糖,与UNIX理念相反(GNU grep的下一步是什么-排序输出的选项?翻译字符的选项?做数学的选项?)因此,当
find
已经存在时,永远不要使用它来递归地查找文件,并且做得很好。感谢您的回复。我有点困惑-似乎你的意思是-r选项永远不应该与grep一起使用,因为find命令可以很好地处理搜索?只是想确认一下。是的,没错。递归查找文件的UNIX命令有点明显地命名为
find
。任何用于递归搜索文件的GNU grep参数都不应该被使用,因为它们的存在违反了UNIX的理念,即每个工具只做一项工作,而且做得很好,并且通常会导致文件查找参数中的文件查找参数与regexp混合在一起,从而导致一堆令人毛骨悚然的复杂参数
grep
字面意思是
g/re/p
,是在文件中全局搜索正则表达式并打印匹配字符串的
ed
命令。