2012-04-10 6 views
4

などのhttp.confファイル内のブロック持つことで、ブロック内の文字列を挿入する方法:バッシュ:チェックして、ファイル

<IfModule mime_module> 
    ... 
</IfModule> 

bashを使用してと仮定し、どのように私がチェックすることができ、以下の行であれば

、どのように私は

<IfModule mime_module> 
    ... 
    AddHandler application/x-httpd-php .php 
</IfModule> 
が得られ、その下部にそれを追加することができない場合
AddHandler application/x-httpd-php .php 

はすでに、前のブロック、
以内に添加されています

このブロックは、ファイルの真ん中にあります。
ファイルの内容がこのブロックで開始または終了しません。


EDITED:
これは難しくするために、私はあまりにも、さらにチェックが必要実現:申し訳ありませんが、私の質問でそれを逃したと。上記ラインは

# AddHandler application/x-httpd-php .php 

としてコメント行として挙げブロック内に既に存在する場合、それはいくつかを持っているかいない可能性がありますように(、チャー#は、行の最初の文字であるかもしれないか、一部が前に離間している可能性がありますAddHandlerのchar Aの前にスペースを置いてください)、私は単にそれをコメント解除する必要があります。そうでなければ、記述した通りに追加します。 - あなたのテキスト "のAddHandlerがapplication/x-httpd-phpののの.php" と

sed -i ':a;$!N;/^<IfModule mime_module>.*<\/IfModule>/{s/# *\(AddHandler application\/x-httpd-php \.php\)/\1/;/AddHandler application\/x-httpd-php \.php/!s/.*\n/&\n AddHandler application\/x-httpd-php .php\n/;p;d};/^<IfModule mime_module>/ba;P;D' input.conf 
+0

awkを使用できますか?もしそうなら、そのタグを追加することを検討してください、あなたは1時間以内に良い答えを得るでしょう;-)(私からではなく、私は会議に行かなければなりません)。がんばろう。 – shellter

答えて

2

。したがって、コメント(#)が見つかった場合でも、何も見つからない場合でも、ブロックは正しい情報を保持します。

また、これはインライン編集であることに注意することが重要です。このスクリプトをNO BACKUP MADEで実行すると、変更したいファイルが直ちに変更されます。何かをテストする前に、あなたのファイルをバックアップしてください。あなたはOS X上で作業している場合

sed -i '/<\/IfModule>/,/<IfModule>/!s/ \.\.\..*/ \.\.\.\n AddHandler application\/x-httpd-php .php/g' /yourfile 

すると、次のスクリプトを試してみたいことがあり、ファイルの起動の代わりに

#!/bin/bash 

CR="$(printf '\r')" 

sed -i '' "/<\/IfModule>/,/<IfModule>/!s/ \.\.\..*/ \.\.\.${CR} AddHandler application\/x-httpd-php .php/g" /yourfile 

例:

<IfModule> 
    ... 
</IfModule> 
<NOTHING TO CHANGE> 
    ... 
</NOTHING TO CHANGE> 
<IfModule> 
    ... 
# AddHandler application/x-httpd-php .php 
</IfModule> 
<NO CHANGE> 
    ... 
    NO CHANGE 
</NO CHANGE> 

結果:

<IfModule> 
    ... 
    AddHandler application/x-httpd-php .php 
</IfModule> 
<NOTHING TO CHANGE> 
    ... 
</NOTHING TO CHANGE> 
<IfModule> 
    ... 
    AddHandler application/x-httpd-php .php 
</IfModule> 
<NO CHANGE> 
    ... 
    NO CHANGE 
</NO CHANGE> 
+0

これを投稿していただきありがとうございます!私はsedも使いたい。私はポイントのカップルにあなたのコードを修正する必要がありました: 1.のみのIfModuleタグに「mime_module」がブロックにアクションを制限するのAddHandlerがapplication/x-httpd-phpの 2にスラッシュを保護します。 confファイルには、と異なる方法で呼び出されるIfModuleタグが含まれています。コードは、IfModule mime_moduleにのみ追加する必要がありますが、各IfModuleブロック内に文字列を追加します。 3.文字列を追加する前に、文字列を見やすくするために新しい行を追加しました。 –

+0

だから、私のために、あなたの最終的なコードは次のようになります。 SED「-i:!。; $ N;/^ <のIfModule * <\ /のIfModule/{/ AddHandlerのアプリ\/X-のhttpd-phpの\の.PHP/!S /.* \ N /&\ n個のAddHandlerアプリケーション\/X-のhttpd-PHP .PHPする\ n /; P; D};/^ <のIfModule mime_module/BA; P; D」のhttpd.conf –

+0

おかげ@LucaBorrione 、funnily十分に私はちょうど '/'の 'AddHandler'に気付き、修正しました。 'If​​Module'isをもっと明示的にする必要があるならば、私の新しい編集で修正する必要があります。 – potong

7
awk ' 
/mime_module/{ 
    flag=1 
} 

flag && /x-httpd-php/{ 
    has=1 
} 

flag && /<\/IfModule>/{ 
    flag = 0 
    if(!has) 
     print "AddHandler application/x-httpd-php .php" 
} 
1' input.conf 
+0

私はawkであなたのソリューションが好きです、それは非常にきれいです!しかし私はあなたのコードを使用している問題を経験しています:あなたのコードをawk(プログラム)に変更しました 'httpd.conf> /var/lock/httpd.temp.conf && mv /var/lock/httpd.temp.conf httpd。 conf私はtempフォルダを作成し、その中に自分のhttpd.confとtest.shをあなたのコードと共にコピーしました。上記のブロック内の行を含んでいないhttpd.confの 'bash test.sh'で実行しますコードが正しく追加します。次に、httpd.confを編集して追加した行を削除して、もう一度 'bash test'を実行します。あなたのコードは何もしません:それは削除された行を再度追加しません –

+0

とにかく私はさらにチェックが必要であることを実感しました。 –

0

以下はブロック "/のIfModuleのIfModule" 内のものに置き換えられます:これはあなたのために働くかもしれない