【问题标题】:Search and replace unix command line, perl capture group empty搜索替换unix命令行,perl捕获组为空
【发布时间】:2016-10-08 14:24:53
【问题描述】:

我正在尝试对多个文件中的文件内容执行递归搜索和替换。

在许多文件中给出以下内容:

example:{
  something: 'ha',
  somethingElse: 'ah'
}

我想结束:

example:{
  something: 'ha',
  somethingElse: 'ah',
  somethingNew: 'ah ha'
}

在 Mac OS X 上,我正在从父目录中的命令行尝试以下操作:

find . -type f -exec perl -p -i -e "s/somethingElse:(.*)/somethingElse:$1,\n\tsomethingNew: 'ah ha'/g" {} \;

除了捕获组被解释为空白之外,它几乎可以工作,导致:

example:{
  something: 'ha',
  somethingElse:,
  somethingNew: 'ah ha'
}

有什么问题?

也没有绑定到perl,我不介意另一种方法(例如可以使用sed

【问题讨论】:

  • 你需要使用单引号。 $1 在 perl 之前由 bash 解释,因此当 perl 看到它时它是空的。或者只是转义它,因为您在替换中使用单引号。 \$
  • 感谢 @123 这也是一个替代修复
  • 看起来有点像 JSON 或其他结构化数据格式。是吗?因为如果是这样,正则表达式可能就不是这项工作的工具了。
  • 抱歉,无法详细说明。如果它是 JSON,并且您说 500 个文件只是想稍微调整一下,为什么不使用正则表达式呢?还有什么?

标签: regex bash perl unix sed


【解决方案1】:

感谢@123answer in the comments

您需要使用单引号。 $1 在 perl 之前由 bash 解释,因此当 perl 看到它时它是空的。或者只是转义它,因为您在替换中使用单引号。

因此翻译为:

find . -type f -exec perl -p -i -e 's/somethingElse:(.*)/somethingElse:$1,\n\tsomethingNew: '\''ah ha'\''/g' {} \;

或:

find . -type f -exec perl -p -i -e "s/somethingElse:(.*)/somethingElse:\$1,\n\tsomethingNew: 'ah ha'/g" {} \;

在执行此操作时添加文件扩展名也可能是明智之举,猜测原因:您可能会从过高的目录意外执行并损坏版本控制文件,即

find . -type f -name '*.json' -exec perl -p -i -e "s/somethingElse:(.*)/somethingElse:\$1,\n\tsomethingNew: 'ah ha'/g" {} \;

被删除的最初接受的答案建议\1,而不是$1。虽然这有效,但其他评论者将其标记为bad practice

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-12-27
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多