搜索并替换 unix 命令行,perl 捕获组为空



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

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

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,ntsomethingNew: 'ah ha'/g" {} ;

它几乎可以正常工作,但捕获组被解释为空白,导致:

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

怎么了?

也不与perl挂钩,我不介意替代方法(例如可以使用sed

感谢@123在评论中的回答:

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

因此翻译为:

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

或:

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

时添加文件扩展名也可能是明智的,猜猜为什么:您可能会意外地从太高的目录执行并损坏版本控制文件,即

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

最初接受的答案被删除,建议1而不是$1。虽然这奏效了,但其他评论者指出这是不好的做法。

相关内容

  • 没有找到相关文章

最新更新