【问题标题】:Replace string using grep and sed使用 grep 和 sed 替换字符串
【发布时间】:2014-01-13 22:16:24
【问题描述】:

我在一个目录中有一堆文件, 我需要将“AB_”等文件中的行前缀更改为“YZ_” 我该怎么做?

我用过 grep 和 sed 之类的,

grep -nr "AB_" ./ | xargs -0 sed -i 's/AB_/YZ_/g'

但给出错误, : File name too long

文件中的示例字符串为:Hello AB_WORLD!Hello WORLD_AB!

谢谢。

【问题讨论】:

  • en.wikipedia.org/wiki/Xargs: 对 xargs 使用 -0 可以解决这个问题,但是许多 Unix 实用程序不能使用 NUL 作为分隔符(例如 head、tail、ls、echo、sed、tar -v、wc, )。

标签: linux replace sed grep


【解决方案1】:

你的意思是grep -lr不是grep -nr

-l 给你文件名; -n 为您提供带有行号前缀的匹配行

【讨论】:

  • 有了这个改变,sed: can't read ** file name ** : No such file or directory
  • 这些文件名是否有奇怪的字符(对于各种“奇怪”的含义;例如,空格可能会搞砸)? (sed 没有 -0--null 的等价物)
【解决方案2】:

我喜欢 Perl 的这个:
-i 选项将保存带有 .bak 扩展名的原始文件。

$ perl -i.bak -pe 's/^AB_/YZ_/' *.txt

【讨论】:

    【解决方案3】:
    grep -lr "AB_" ./ | while read file
    do
      echo "Change file $file ..."
      sed -i 's/AB_/YZ_/g' ${file}
    done
    

    【讨论】:

      【解决方案4】:

      sed 将接受多个文件作为参数,所以这应该可以工作:

      sed -i '/AB_/s//YZ_/g' *
      

      (注意-i是非标准的)

      【讨论】:

        【解决方案5】:

        sed 单行答案

        在包含字符串“foo”的目录中查找php文件并将所有出现的地方替换为“bar”

        grep -l foo *.php | xargs sed -i '' s/foo/bar/g

        通过目录递归

        grep -rl foo * | xargs sed -i '' s/foo/bar/g

        (刚刚在 8100 个文件上成功完成)

        grep -rl 条 * | wc -l 8102

        【讨论】:

          猜你喜欢
          • 2018-02-24
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-17
          • 1970-01-01
          • 2017-05-14
          相关资源
          最近更新 更多