コマンドラインでUbuntuでマルチバスストレージを有効にしたいと思います。
sed -i "/^# deb.*multiverse/ s/^# //" /etc/apt/sources.list && apt-get update
コマンドは毎回実行されますが、行がコメントアウトされている場合apt-get update
にのみ必要です。sed
sed
文字列が変更されたかどうかを検出し、その結果に基づいてコマンドを実行する簡単な方法はありますか?
ベストアンサー1
この質問にはすでに回答があることを知っていますが、(grepを許可された回答として使用せずに)sed専用の回答を提示することが可能かどうか疑問に思います。その結果、これは可能になります。
sed -ni '/^# deb.*multiverse/{;h;s/^# //;};p;${;g;/^#/!q1;}' /etc/apt/sources.list
&& apt-get update
(もちろんすべてが同じ行にあるはずですが、水平にスクロールせずにすべてが見えるようにしたいです。)
説明する:
- パターンを探す(
/^# deb.*multiverse/
) - 見つかった場合:
- スペアバッファにラインを保持(
h
) - コメント解除(
s/^# //
)
- スペアバッファにラインを保持(
- この行を印刷してください
$
最後の行( )のみ- 保持バッファのラインをパターンバッファにコピーします。 (
g
) - 保持バッファがコメント記号で始まるか(または置換が発生していない場合は空であるか)テストします。 (
/^#/
) - 一致するものがない場合は、
1
置き換えが行われなかったことを示すコード(!q1
)で終了します。それ以外の場合は、コードで正常に終了します0
。
- 保持バッファのラインをパターンバッファにコピーします。 (
今、私はこの答えが単にgrepを使用するほど明確ではないことを知っていますが、私はこの課題に興味があり、これを要求したので共有する必要があると思いました。