使用 sed 计算反向引用

Using sed with back-references calculated

我愿意

pm.max_children = 5

成为;

pm.max_children = 8

并且一直在努力,但没有得到任何解决方案。像 \1 或 \2 这样的反向引用似乎不能用于计算。

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

用perl命令也行,只要解决了

谢谢。

使用sed

$ sed 's/\(.* \)\(.*\)/echo  $((+3))/e' /usr/local/etc/php-fpm.d/www.conf
pm.max_children = 8
perl -i.bak -wpe's/pm.max_children\s*=\s*\K([0-9]+)/ + 3/e' file

由于.bak,这保留了一个备份;如果不需要备份,请将其删除(测试后)。

\K positive lookbehind 删除所有之前的匹配,因此它们不再包含在整体匹配中 $&,因此之前匹配的任何内容都保留在字符串中并且没有将在替换部分恢复。

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

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

完全匹配:

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

只匹配最后一个数字:

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

输出:

pm.max_children = 8

对于文件,您可以使用 -i in-place 保存,而不是 <<< (这里是用于测试的文档)使用文件。

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