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
しかし、それは機能していません。
どう?
#ServerRoot "/etc/Apache2"
を検索ServerName 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
最後に、ダブル--\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
でかなり簡単ですが、同じファイルに書き戻すには、一時的な中間ファイルまたはsponge
(moreutils
パッケージから)が必要です。両方の方法を示します。
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での任意の「スワップ」よりも読みやすいと思います。
別の方法(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