2012-02-29 62 views
1

我一直在这个小时,由于某种原因,我找不到为什么这个命令不会取代所需的字符串。我想这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.fourth""foo.bar.fooey"。在我运行grep和sed命令之后,我再次grep以确保找不到“first.second.third.fourth”,但是它出现了,我相信它只是同样多次。所以我几乎在智慧的结尾。

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

回答

3

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

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

不要忘记在sed中替代命令的LHS中的'.'意味着匹配任何单个字符。要匹配一段时间,请使用'\ .' – potong 2012-02-29 00:34:16

+0

@potong,您说得对,我甚至没有注意到这一点。编辑... – Beta 2012-02-29 00:38:00

+0

@potong你绝对正确。我确实在我的终端上有这个功能,但是当我把它复制过来时,并没有把这个功能转移到我的错误中。 – bdc 2012-02-29 01:08:02

0

为什么不使用单个find/sed

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

我认为他试图改变一个字符串的所有实例,而不仅仅是名称与模式匹配的文件。 (我假设他使用的是grep而不是没有过滤器,以避免更改不受影响的文件的时间戳。) – Beta 2012-02-29 15:08:20

+0

对于每个文件,只应该省略'-iname“* YOURFILENAME *”'模式。 – 2012-02-29 19:08:27