7行をgrepして一致後にテキストを置き換えるにはどうすればよいですか?

7行をgrepして一致後にテキストを置き換えるにはどうすればよいですか?

一致したら、7行をgrepし、この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

モジュール名を一致させた後、次の「MaxRequestsPerChild」行を5000の値に置き換えるように動作します。他のすべてのモジュールについては「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. この範囲内にない行は保持され、標準出力に渡されます。

関連情報