Regex grep或find和sed替换字符串

Regex grep或find和sed替换字符串,regex,sed,grep,Regex,Sed,Grep,我已经做了几个小时了,由于某种原因,我无法找到为什么这个命令不能替换所需的字符串。我在试这个 grep -r -l 'first\.second\.third\.fourth' . | xargs -i -e sed's/first\.second\.third\.fourth/foo\.bar\.fooey/g' 所以我要做的是递归地搜索一个包含大量文件的文件夹,然后将“first.second.third.4th”更改为“foo.bar.fooey”。在我运行grep和sed命令之后,我再

我已经做了几个小时了,由于某种原因,我无法找到为什么这个命令不能替换所需的字符串。我在试这个

grep -r -l 'first\.second\.third\.fourth' . | xargs -i -e sed's/first\.second\.third\.fourth/foo\.bar\.fooey/g'
所以我要做的是递归地搜索一个包含大量文件的文件夹,然后将
“first.second.third.4th”
更改为
“foo.bar.fooey”
。在我运行grep和sed命令之后,我再次grep以确保没有找到“first.second.third.fourth”,但它会出现,我相信会出现同样多次。所以我几乎不知所措了


任何帮助都将不胜感激。谢谢大家。

这个
-i
应该是sed的参数,而不是xargs的参数。正如@potong所指出的,sed的匹配字符串中的“.”字符必须转义,否则它们将匹配任何内容

grep -r -l 'first.second.third.fourth' . | xargs sed -i 's/first\.second\.third\.fourth/foo.bar.fooey/g'

为什么不使用单个
查找
/
sed

find /YOUR/DIR -type f -iname "*YOURFILENAMEPATTERN*" \
     -exec sed -i 's/"first.second.third.fourth"/"foo.bar.fooey"/g'

不要忘记sed中替换命令的LHS中的
,表示匹配任何单个字符。要匹配句号,请使用
\。
@potong您完全正确。我的终端机里确实有,但当我把它复制过来的时候,它并没有被转移。。。我的错。谢谢@Beta为我指明了正确的方向。在玩了一番之后,这就是玩这个把戏的原因。grep-l-r'first\.second\.third\.4th./|xargs sed-i''s/first\.second\.third\.4th/foo\.bar\.fooey/g'注意-i后面的空引号。这是关键,如果你不加引号,你会得到一个错误。据我所知,空引号是为了删除原始文件。为什么需要“删除原始文件”?它应该与Beta提供的命令一起工作。我认为他正在尝试更改字符串的所有实例,而不仅仅是名称与模式匹配的文件中的实例。(我猜想他使用的是grep而不是无过滤器,以避免更改未受影响文件的时间戳。)对于每个文件,您应该只保留
-iname“*YOURFILENAME*”
模式。