我正在尝试在匹配后 grep 7 行并替换这 7 行中的上下文并将其保存在同一个文件中。
例如:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
我想用 替换 的MaxRequestsPerChild
值5000
。
我尝试过:
grep "IfModule prefork.c" httpd.conf -A7 | /bin/sed -nE "/\bMaxRequestsPerChild\b/ s/[0-9]+/50/"
但没有运气。
答案1
这是一个 SED 解决方案。
sed '/<IfModule prefork.c>/,/MaxRequestsPerChild/s/MaxRequestsPerChild.*/MaxRequestsPerChild 5000/' apacheconf
它的工作原理是匹配模块名称,然后用 5000 值替换下一个“MaxRequestsPerChild”行。它将忽略所有其他模块的“MaxRequestsPerChild”。
答案2
使用 GNU sed(不确定语法/功能是否适用于其他版本)
要在匹配行后 6 行内更改:
sed -E '/IfModule prefork\.c/{N;N;N;N;N;N;s/(MaxRequestsPerChild +)[0-9]+/\15000/}'
在这里,N
将向模式空间添加换行符,然后将下一行输入附加到模式空间
如果始终是第 6 行:
sed -E '/IfModule prefork\.c/{n;n;n;n;n;n;s/[0-9]+/5000/}'
这里n
将用下一行输入替换模式空间
或者,使用相对寻址的更简单语法
sed -E '/IfModule prefork\.c/,+6 s/(MaxRequestsPerChild +)[0-9]+/\15000/'
答案3
你可以把 sed 的 range operator ,
如果您对行号不感兴趣,请充分利用此处:
sed -e '
/<IfModule prefork.c>/,\|</IfModule>|!b
H;\|</IfModule>|!d;g;s/.//;
s/\(\(\n\)MaxRequestsPerChild[[:blank:]]\{1,\}\)[1-9][0-9]*\n/\15000\2/
' config-file
- 将范围存储在保留空间中。
- 当检测到范围末端时,从保持区域检索范围,并且
- 执行所需的替换。
- 不在该范围内的行将被保留并传递到标准输出。