Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用给定文本递归地包装正则表达式_Regex_Linux_Replace - Fatal编程技术网

Regex 用给定文本递归地包装正则表达式

Regex 用给定文本递归地包装正则表达式,regex,linux,replace,Regex,Linux,Replace,对于给定的路径,我希望使用标准的LinuxShell命令,在该路径或该路径的子目录中的所有文件中用一些给定的文本包装一个给定的正则表达式 更具体地说,使用assert命令包装我的所有syslog命令,例如syslog(LOG_INFO,json_encode($obj))变成断言(syslog(LOG_INFO,json_encode($obj)) 我认为下面的方法可能有效,但收到了sed:-e expression#1,char 47:Invalid preference regular ex

对于给定的路径,我希望使用标准的LinuxShell命令,在该路径或该路径的子目录中的所有文件中用一些给定的文本包装一个给定的正则表达式

更具体地说,使用assert命令包装我的所有syslog命令,例如
syslog(LOG_INFO,json_encode($obj))变成
断言(syslog(LOG_INFO,json_encode($obj))

我认为下面的方法可能有效,但收到了
sed:-e expression#1,char 47:Invalid preference regular expression
错误

sed -i -E "s/(?<=syslog\()(.*)(?=\);)/assert(syslog(\1));/" /path/to/somewhere
  • -i
    就地编辑文件。人们可以先在屏幕上看会发生什么变化
  • s
    替换文本
  • 图案和替换(即,
    /pattern/replacement/
    )周围的三个
    /
    )是除沫器,可以是任何单个字符,而不仅仅是
    /
  • syslog(\(.*)带有一个占位符的模式。使用转义括号
  • assert(syslog(\1))使用转义的
    1
    (或
    2
    3
    等)替换替换子字符串
  • g
    替换所有匹配项,而不仅仅是第一个匹配项

sed-i“s/syslog(.*);/assert(&);/g”/path/to/where
也能工作吗?

sed
模式不支持类似
(?如果需要与Perl兼容的正则表达式构造,可以使用Perl(sic)


perl-i-pe的/(?谢谢Wiktor。以前从未使用过
sed
。请查看我编辑的原始问题并确认其是否准确。谢谢,这只适用于单个常规文件
/path/to/somewhere
?如果
/path/to/somewhere
是一个目录,而我希望它适用于此目录和子目录中的所有文件会怎么样?啊,我怎么看。
find~/test-typef-print0 | xargs-0sed-I“s/syslog(\(.*);/assert(syslog(\1));/g”
。仍然希望您对我编辑过的问题的评论能够回应您的答案。这不完全是因为它包含了额外的
,而是
sed-I“s/syslog(.*);/assert(&);/g”./test
似乎有效。我想在执行递归解决方案之前显示匹配项,因此省略了
-I
标志,但它会显示所有结果。知道如何在使用就地编辑之前显示匹配的行吗?对于您的特定问题,可以轻松地将正则表达式重构为ERE甚至BRE正则表达式,而无需lookbehinds等。如果您的需求比这更复杂,或者您觉得无法了解您(显然)知道的regex方言与许多其他方言之间的差异,这可能会有所帮助。
sed -i "s/syslog(\(.*\));/assert(syslog(\1));/g" /path/to/somewhere
sed -i "s/syslog(\(.*\));/assert(syslog(\1));/g" /path/to/somewhere
perl -i -pe 's/(?<=syslog\()(.*)(?=\);)/assert(syslog($1));/' /path/to/somewhere