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

时间:2016-06-08 10:51:29

标签: regex bash perl unix sed

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

在以下文件中给出了以下内容:

select a.code, a.name, bc.bname, bc.cname
from a left join
     (select coalesce(b.code, c.code) as code, bname, cname
      from (select code, bname, NULL as cname,
                    row_number() over (partition by code order by code) as seqnum
            from b
           ) b full outer join
           (select code, NULL as bname, cname,
                    row_number() over (partition by code order by code) as seqnum
            from c
           ) c
           on b.code = c.code and b.seqnum = c.seqnum
      ) bc
      on bc.code = a.code;

我想结束:

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

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

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

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

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

1 个答案:

答案 0 :(得分: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