递归用给定文本包裹正则表达式



对于给定路径,我希望在该路径中的所有文件中包装给定的正则表达式或使用标准Linux shell命令的某些给定文本中的所有文件中的所有文件。

更具体地说,将我所有的syslog命令与 syslog(LOG_INFO,json_encode($obj));这样的断言命令包装为 assert(syslog(LOG_INFO,json_encode($obj)));

我认为以下可能有效,但收到了sed: -e expression #1, char 47: Invalid preceding regular expression错误。

sed -i -E "s/(?<=syslog()(.*)(?=);)/assert(syslog(1));/" /path/to/somewhere

响应WiktorstribiêEw的答案

备份信息

我以前从未使用过sed。请确认我对您的答案的理解:

sed -i "s/syslog((.*));/assert(syslog(1));/g" /path/to/somewhere
  • -i编辑文件。一个人可能首先抛弃在屏幕上查看将要更改的内容。
  • s替代文本
  • 围绕图案和替换的三个/(即/pattern/replacement/)是分界符,并且可以是任何单个字符,而不仅仅是/
  • syslog((.*));带有一个占位符的图案。使用逃脱的括号。
  • assert(syslog(1));使用ESC的1(或23等)替换用于替换子弦。
  • g不仅替换了第一场比赛。

sed -i "s/syslog(.*);/assert(&);/g" /path/to/somewhere也可以工作吗?

sed模式不支持诸如 (?<=...)(?=...)

您可以使用捕获组/替换后将:

sed -i "s/syslog((.*));/assert(syslog(1));/g" /path/to/somewhere

模式是bre posix味道(没有-E选项),因此要定义一个捕获组,您需要使用逃逸的括号,而UneScaper的括号将符合字面的括号。

详细信息

  • syslog( - syslog( substring
  • (.*)-组1:任何0 chars尽可能多
  • ); -a ); substring

替换是assert(syslog(1));,即,匹配被assert(syslog(,组1的内容替换,然后是));

如果您需要兼容Perl兼容的正则正则构造,则可以使用Perl(sic)。

perl -i -pe 's/(?<=syslog()(.*)(?=);)/assert(syslog($1));/' /path/to/somewhere

无论您使用哪种特定解决方案,我都在假设您在Unix-ish平台上的假设上切换到单个引号。双引号内的后斜切是讨厌的(有时您需要加倍,有时不加倍)。

perl在替换模式中比1更喜欢$1,尽管后者在技术上也可以工作。

最新更新