对于给定路径,我希望在该路径中的所有文件中包装给定的正则表达式或使用标准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
(或2
,3
等)替换用于替换子弦。 -
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
,尽管后者在技术上也可以工作。