2016-06-08 48 views
0

我试图执行递归搜索并替换多个文件中的文件内容。搜索并替换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,\n\tsomethingNew: 'ah ha'/g" {} \; 

它几乎工作,除了捕获组被解释为空白导致我n:

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

什么问题?

而且不依赖于perl,我不介意的替代方法(可以使用sed例如)

+4

您需要使用单引号。 $ 1在perl之前由bash解释,因此perl在看到它时是空的。或者只是逃避它,因为你在替换中使用单引号。 '\ $' – 123

+0

谢谢@ 123这也是一种替代修复 –

+4

看起来有点像JSON或其他结构化数据格式。是吗?因为如果是这样,正则表达式可能不是工作的工具。 – Sobrique

回答

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