我正在尝试执行递归搜索并替换多个文件中的文件内容。
在多个文件中给出以下内容:
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
。虽然这奏效了,但其他评论者指出这是不好的做法。