ディレクトリへの上書きを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 sed
)sed
改行を無視します。つまり、ファイル全体をロードします。カラットでマークされた2つは?
消えなければなりません。そして、彼らは"
逃げる必要がないことに注意してください\
(ただし害はありません)。