0

私はシェル スクリプトと Linux 環境の初心者です。

私のプロジェクトでは、 httpd.conf ファイルから次のテキストを検索しようとしています

<Directory '/somedir/someinnerdir'>
AllowOverride All
</Directory>

次に、このテキストを削除して、同じテキストをもう一度書き直します。この書き換えを行う理由は、スクリプトが Web アプリの最初のインストール時に実行されるためですが、このシェル スクリプトの他の部分が他のタスクも実行しているため、しばらくしてから再度実行される可能性があるためです。したがって、最初はこのテキストが見つからず、単純に書き込まれますが、後でスクリプトを実行すると、このテキストが見つかり、削除して再度書き込む必要があります。

したがって、これを達成しようとしているスクリプトの部分は次のようなものです。

grep -ve "<Directory '/somedir/someinnerdir'>\\nAllowOverride All\\n</Directory>" /etc/httpd/conf/httpd.conf > tmp_direct

echo -e "<Directory '/somedir/someinnerdir'>\\nAllowOverride All\\n</Directory>" >> tmp_direct

mv tmp_direct /etc/httpd/conf/httpd.conf

現在目の前にコードがないため、上記の構文エラーがある可能性がありますが、ロジック/コーディングは同じです。

上記のコード フラグメントは、grep コマンドが複数行の検索をサポートしていないため、達成したいことを実行できません。

私のOSはFedora8です。

必要なことを達成するために、このコードで何かを提案してください。

この点でどんな助けでも大歓迎です。

前もって感謝します。


返信ありがとうございます。

以前の悪いコードで申し訳ありません。現在修正されています。

Charlie と i-moan、作業性の制約により、このプロジェクトを配布する環境に追加する必要があるため、sed または perl を実装することはできません。

スティーブ、複数行のチェックをしたい。コードブロックに入れなかったので、ディレクトリタグを削除しました。:(

そのため、別の方法を見つける必要があります。

再度、感謝します。

よろしくお願いします。

4

3 に答える 3

1

これは の仕事のようですねsed(1)。あなたが望むものは非常に近いでしょう

sed -i.bak -e '/AllowOverride All/i# '  file

行をコメントアウトします (httpd.conf にはコメントがあることに注意してください)。

sed -i.bak -e 's/# AllowOverride All/AllowOverride All '  file

それを戻すために。

警告私は試していません。man ページを読んで自分でテストしてください。

于 2009-04-17T03:12:02.027 に答える
0

質問を理解しているかどうかわかりません。私が間違っている場合は修正してください。ただし、スクリプトの最初の実行時に「AllowOverride All」を httpd.conf に追加しようとしています。もしそうなら、それを有効にしますか?

次に、2回目のパスで、コマンドを有効/無効にすることができますか?

私の記憶が正しければ、'AllowOverride' は< Directory >セクションでのみ許可されているため、 < Directory >< /Directory >定義で追加/有効化することだけが理にかなっています。

上記が当てはまる場合、perlでこれを行うことができます..

1 回目: 追加する

perl -0777 -pi -e 's{(. ?(?!AllowOverride\s+All). ?)}[\nAllowOverride All\n$1]ixgs' httpd.conf

これにより、「AllowOverride All」がディレクトリ セクションにまだ含まれていない場合にのみ、そのセクションに追加されます。

2 回目: 変更する

2回目の実行では、チャーリーが提案したようにコメントアウトできます..またはperlが好きなら

perl -0777 -pi -e's{(. ?)(AllowOverride\s+All)(. ?)}[$1#$2$3]ixgs' httpd.conf

そしてコメントする

perl -0777 -pi -e's{(. ?)(#AllowOverride\s+All)(. ?)}[$1AllowOverride\s+All$3]ixgs' httpd.conf

正規表現s{}[]は非常に冗長であり、同じことを行うためのより良い正規表現がありますが、これは (できれば) 初心者にとって理解しやすいものです :)。

perlコマンドオプションの説明

-0777 0777 は正当な文字値ではないため、Perl がファイル全体を一度に読み取るように強制します。

-pは、スクリプトにループを配置します

-iファイルをその場で編集できます(したがって、「-e」のコマンドでファイルが変更されます)

-eを使用すると、コマンド ラインで 1 行のコードを指定できます

その 1 行に正規表現があります。それに関する情報については、 perldoc perlreを参照 してください。

それが役立つことを願っています

于 2009-04-17T05:40:47.163 に答える
0

行全体を一致させたい場合は、次のようにします: grep -v "^AllowOverride All$"

^ は行頭に一致し、$ は行末に一致します。

それは役に立ちますか?あなたがgrepで何をしようとしているのか正確にはわかりません。

于 2009-04-17T03:11:21.763 に答える