一致内で(すべての一致ではない)テキストを置き換えるにはどうすればよいですか?

一致内で(すべての一致ではない)テキストを置き換えるにはどうすればよいですか?

AllowOverride Noneパスがあるグループで交換したいです/var/www/。これにはsedを使用していますが、すべての一致を置き換えます。

Apache2.confスクリプトを実行する前に

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Apache2.confスクリプトを実行した後

<Directory />
    Options FollowSymLinks
    AllowOverride All
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride All
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

スクリプトファイル

#!/bin/bash

sed "s/AllowOverride None/AllowOverride All/g" apache2.conf

私の質問は次のとおりですsedに交換するようにどのように言いますか/var/www/

ベストアンサー1

これを達成するには、次のPerl onelinerを使用できます。

perl -0777 -pe 's{(<Directory\s/var/www/.*?AllowOverride\s)None(.*?</Directory>)}{$1All$2}gs' /tmp/file

この-0777フラグは行区切り文字をundefに変更するため、perlはファイルを1行に読み込みます(大容量ファイルでは問題になる可能性があります)。

-pファイル行を繰り返し印刷し、 -eスクリプト、 /tmp/file構成ファイルを実行します。

s{(<Directory\s/var/www/.*?AllowOverride\s)None(.*?</Directory>)}{$1All$2}gs/var/www の 2 つの部分で構成されるディレクトリセクションと一致し、デフォルトで None を All に置き換える正規表現です。 Perlでは、ほぼすべてのシンボルを正規表現の区切り文字として使用できます。この場合{}//

おすすめ記事