perl 使用sed并计算反向引用

hrirmatl  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(196)

我想

pm.max_children = 5

成为;

pm.max_children = 8

并一直在研究它,但没有得到解决方案。像\1或\2这样的反向引用似乎不适用于计算。

sed -i -E "s/(pm.max_children)[^=]*=\s*(.+)/\1 = $(echo \2+3)/" /usr/local/etc/php-fpm.d/www.conf

使用perl命令也是可以的,只要它得到解决。

  • 谢谢-谢谢
wbrvyc0a

wbrvyc0a1#

perl -i.bak -wpe's/pm.max_children\s*=\s*\K([0-9]+)/$1 + 3/e' file

这将保留一个备份,由于.bak;如果您不需要备份,请在测试后删除它。
\K正lookbehind会丢弃所有先前的匹配项,这样它们就不再包含在$&的总匹配项中,因此之前匹配的任何内容都将保留在字符串中,而不必在替换部分中恢复。

hs1ihplo

hs1ihplo2#

使用sed

$ sed 's/\(.* \)\(.*\)/echo \1 \$((\2+3))/e' /usr/local/etc/php-fpm.d/www.conf
pm.max_children = 8
flvlnr44

flvlnr443#

方法有很多,这是其中之一:

perl -lpe 's/(?<= = )(\d)/${1}+3/e' <<< 'pm.max_children = 5'

对于完全匹配:

perl -lpe 's/pm.max_children = \K(\d)/${1}+3/e' <<< 'pm.max_children = 5'

只需匹配末尾的数字:

perl -lpe 's/(\d)$/${1}+3/e' <<< 'pm.max_children = 5'

输出:

pm.max_children = 8

对于文件,您可以使用-i就地保存,而不是使用<<<(此处为用于测试的文档)。

perl -i -lpe '...' <FILE>

相关问题