我正在尝试执行递归搜索并替换多个文件中的文件内容。
在以下文件中给出了以下内容:
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
)
答案 0 :(得分:1)
感谢@123的answer 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。