如何在匹配后 grep 7 行并替换文本?

如何在匹配后 grep 7 行并替换文本?

我正在尝试在匹配后 grep 7 行并替换这 7 行中的上下文并将其保存在同一个文件中。

例如:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

我想用 替换 的MaxRequestsPerChild5000

我尝试过:

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
  1. 将范围存储在保留空间中。
  2. 当检测到范围末端时,从保持区域检索范围,并且
  3. 执行所需的替换。
  4. 不在该范围内的行将被保留并传递到标准输出。

相关内容