web-dev-qa-db-ja.com

sedは改行を含むテキストを置き換えます

UbuntuサーバーにWebサーバーをインストールするためのbashスクリプトがあります。

/etc/Apache2/Apache2.confで置き換えたい

#ServerRoot "/etc/Apache2"

#

沿って

#ServerRoot "/etc/Apache2"
ServerName localhost

#

私が行った場合

sed -i 's|#ServerRoot "/etc/Apache2"|#ServerRoot "/etc/Apache2"\nServerName localhost|' /etc/Apache2/Apache2.conf

動作していますが、スクリプトが2回実行された場合にServerNameを2回追加しないように、#ServerRootの後に空白行と#を含めたいと思います。

私は試した

sed -i 's|#ServerRoot "/etc/Apache2"\n\n#|#ServerRoot "/etc/Apache2"\nServerName localhost\n\n#|' /etc/Apache2/Apache2.conf

しかし、それは機能していません。

3
tweetysat

どう?

  1. #ServerRoot "/etc/Apache2"を検索
  2. 見つかったら、次の行を読んでsedのパターンスペースに追加します
  3. 改行の後に追加されたパターンスペースで空行を検索し、thatServerName localhostに置き換えます

それをまとめると、

sed -i '\|#ServerRoot "/etc/Apache2"| {N;s|\n$|\nServerName localhost|}' /etc/Apache2/Apache2.conf

「空の」行に実際に空白が含まれている場合は、それを次のように変更できます。

sed -i '\|#ServerRoot "/etc/Apache2"| {N;s|\n\s*$|\nServerName localhost|}' /etc/Apache2/Apache2.conf
2
steeldriver

最後に、ダブル--\nチェックがsedで機能し、 from from の助けを借りました。一口のビット:

sed -Ei ':a;N;$!ba;s/^(#ServerRoot[^\n]*)\n\n/\1\nServerName localhost\n\n/' Apache2.conf

そして、同じことをするawk(より長いが理解しやすいIMO)。ロジックとspongeについては、最後のセクションで説明します。

awk '{print}/^#ServerRoot/{getline; if($0=="") print "ServerName localhost"; print}' Apache2.conf | sponge Apache2.conf

編集:sedは元々思っていたほど難しくありません。マッチして追加したいだけです(aコマンド);交換する必要はありません。私は次のものが動作していることをテストしました:

sed -i '/^#ServerRoot/a ServerName localhost' Apache2.conf

あなたが望むなら、あなたはあなたの試合をより具体的にすることができます、そして、私は後世のためにawkを残します。


編集はawkでかなり簡単ですが、同じファイルに書き戻すには、一時的な中間ファイルまたはspongemoreutilsパッケージから)が必要です。両方の方法を示します。

awk '{print}/^#ServerRoot/{print "ServerName localhost"}' Apache2.conf > tmp
mv tmp Apache2.conf

または

awk '{print}/^#ServerRoot/{print "ServerName localhost"}' Apache2.conf | sponge Apache2.conf

awkは、見つかったすべての行を印刷するだけですが、^#ServerNameに一致する場合は、ServerName行を書き込みます。この種の処理は、sedでの任意の「スワップ」よりも読みやすいと思います。

0
Oli

別の方法(muruに感謝)ですが、sedを使用していないため、少し前後関係がありません:

buntu 14.04の場合:

ファイルを作成fqdn.conf dans / etc/Apache2/conf-available /を含む

ServerName localhost

/ etc/Apache2/conf-enabled /にシンボリックリンクを作成します

Sudo ln -s /etc/Apache2/conf-available/fqdn.conf /etc/Apache2/conf-enabled/fqdn.conf
0
tweetysat