内部の複数行文字列置換タグ

内部の複数行文字列置換タグ

ディレクトリへの上書きをhttpd.conf許可するようにファイルを変更しようとしています。/var/www/html単純化のために、次のように仮定しましょう。

<Directory "/var/www/html">
    # Comment
    AllowOverride none
    # Comment
</Directory>

AllowOverride noneと交換してみてくださいAllowOverride All

私は次のことを試しました:

sed -i 's/\(Directory \"\/var\/www\/html\">.*?\)AllowOverride none\(.*?<\/Directory>\)/\1AllowOverride all\2/' httpd.conf

私はいくつかの行をキャプチャするようには思えなかったので、正規表現修飾子などの他のいくつかの操作を試しました。https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html ただし、必須文字列は一致できません。

この仕事をどうしますか? sed以外のソリューションも大歓迎です。

答え1

私はあなたが望むものは他の場所ではなく、そのAllowOverride noneブロック内の特定のコンテンツを置き換えることであると仮定します。<Directory "/var/www/html">私たちはできます。

簡潔なバージョン:

sed -i '/^<Directory "\/var\/www\/html">/,/^<\/Directory>/ {
    s/AllowOverride none/AllowOverride all/;
}' httpd.conf

これは、代替コマンドが指定された行間にのみ適用されることを意味します。

まず、ファイルをバックアップしてからdiffもう一度バックアップして、必要なファイルがあることを確認してください。 :)

答え2

sed行ベースの *nix テキストツールです。複数の行で作業するには、特定のアクションを取る必要があります。なぜできないの

sed 's/AllowOverride none/AllowOverride all/' file

あなたの要件を満たしていますか?

編集する:または、「目次」段落の文字列のみを変更したい場合は、

sed '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride none/AllowOverride all/' file

編集する:3 つの小さな調整により、スクリプトが正しく機能するようになります。

sed    's/\(Directory \"\/var\/www\/html\">.*?\)AllowOverride none\(.*?<\/Directory>\)/\1AllowOverride all\2/' file
sed -z 's/\(Directory \"\/var\/www\/html\">.*\)AllowOverride none\(.*<\/Directory>\)/\1AllowOverride all\2/' file
     ^                                       ^                        ^ 

-z(--null-data、NUL文字で行を区切ります。参照man sedsed改行を無視します。つまり、ファイル全体をロードします。カラットでマークされた2つは?消えなければなりません。そして、彼らは"逃げる必要がないことに注意してください\(ただし害はありません)。

関連情報