【问题标题】:grep or find and sed to replace stringgrep 或 find 和 sed 替换字符串
【发布时间】: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”,但它出现了,我相信它会出现多次。所以我几乎无能为力了。

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

【问题讨论】:

    标签: regex sed grep


    【解决方案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*" 模式。
    猜你喜欢
    • 2014-01-13
    • 2018-02-24
    • 2020-11-15
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多