0

ここの初心者、

/etc/network/interfaces(現在) を使用して、起動時に新しくプロビジョニングされた XEN Ubuntu (12.04/10.04/8.04) DomU サーバーの自動生成ファイルに書き込もうとしていますsed

自動生成されたファイルは、次のようにフォーマットされます。

自動 eth0
iface eth0 inet 静的
    アドレス 192.168.0.88
    ゲートウェイ 192.168.0.254
    ネットワーク 255.255.255.255
オートロー
iface lo inet ループバック

を使用してsed、1 行目と 2 行目を変更し、3 行目を追加し、ゲートウェイと最後の 2 行を削除し、最後に 4 行を追加しようとしています。

スクリプトは実行されるたびにこの行を追加するため、現在、3 行目の追加に行き詰まっています。

#!/ビン/バッシュ

sed -i "1s/.*/auto lo eth0/" /tmp/interfaces
sed -i "2s/.*/iface lo inet loopback/" /tmp/interfaces
sed -i "2a\iface eth0 inet static" /tmp/interfaces
sed -i "s/auto lo//g" /tmp/interfaces

sed(または)を使用して、存在しない場合にのみ 3 行目を追加することはできawkますか?

同様に、存在しない場合にのみ、ゲートウェイと最後の 2 行を削除するにはどうすればよいですか?

私は初めてなので、これを達成するためsedに代わりに見るべきかどうか疑問に思っていますか?awk

4

2 に答える 2

5

あなたはsedでそれを行うことができます:

sed -i -e '4{/iface eth0 inet static/! i\
    iface eth0 inet static
    }'

中括弧を使用してコマンドをグループ化できます。中括弧内のコマンドは、3 行目でのみ実行されます。挿入コマンドはi3 行目でのみ実行され、3 行がスラッシュ間の文字列と一致しない場合 (!一致しない場合に実行するように指示した後)。

同じようにして削除できます。

sed -i -e '3{/gateway/d}'

ここでは、文字列 が含まれている場合にのみ 3 行目を削除しますgateway。おそらくもっと一般的で、単純に次のようにすることができます。

sed -i -e '/gateway/d'

これにより、ゲートウェイを含むすべての行が削除されますが、それはあなたが望むものではないかもしれません.

最後の行を削除する場合、最も簡単な解決策は次のとおりです。

sed -i -e '${/auto lo/d;/iface lo inet loopback/d}'
sed -i -e '${/auto lo/d;/iface lo inet loopback/d}'

または のいずれかdに一致する場合、最後の行で削除コマンドが実行されます。2 回実行すると、パターンに一致する場合、最後の 2 行が削除されます。auto loiface lo inet loopback

ファイルの末尾に行を追加する場合は、次のようにします。

sed -i -e '$a\
newline1\
newline2\
newline3'

または、最後の行が特定の行でない場合にのみ追加することもできます:

sed -i -e '${/192\.168\.1\.1/!a\
newline1\
newline2\
newline3
}'

これが少し役立つことを願っています=)

于 2012-10-09T11:51:23.257 に答える