grep 或 find 和 sed 替换字符串

Posted

技术标签:

【中文标题】grep 或 find 和 sed 替换字符串【英文标题】:grep or find and sed to replace string 【发布时间】:2012-02-29 00:05:50 【问题描述】:

我已经做了好几个小时了,出于某种原因,我不知道为什么这个命令不会替换所需的字符串。我正在尝试这个

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”,但它出现了,我相信它会出现多次。所以我几乎无能为力了。

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

【问题讨论】:

【参考方案1】:

-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 中替换命令的 LHS 中的 . 表示匹配任何单个字符。要匹配句点,请使用 \. @potong 你是绝对正确的。我的终端里确实有这个,但是当我把它复制过来时,它并没有进行转移……我的错。 感谢@Beta 为我指明了正确的方向。在玩了一些之后,这就是诀窍。 grep -l -r 'first\.second\.third\.fourth' ./| xargs sed -i "" 's/first\.second\.third\.fourth/foo\.bar\.fooey/g' 注意 -i 后面的空引号。这是关键,如果你不加引号,你会得到一个错误。据我了解,空引号是为了删除原始文件。 为什么需要“擦除原始文件”?它应该与 Beta 提供的命令一起使用。【参考方案2】:

为什么不使用单个find/sed

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

【讨论】:

我认为他正在尝试更改字符串的所有实例,而不仅仅是名称与模式匹配的文件中的实例。 (我认为他使用 grep 而不是没有过滤器,以避免更改未受影响文件的时间戳。) 对于每个文件,您应该只省略 -iname "*YOURFILENAME*" 模式。

以上是关于grep 或 find 和 sed 替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何grep和替换

如何grep和替换

Linux系列:grep过滤awk拆分sed替换的使用方法与区别

是否可以使用 grep 或 find 命令替换仅给出前几个和最后几个单词的给定字符串

grep和sed替换文件中的字符串

grep和sed替换文件中的字符串