sedが文字列を置き換えるときにのみコマンドを実行する方法

sedが文字列を置き換えるときにのみコマンドを実行する方法

コマンドラインで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を使用するほど明確ではないことを知っていますが、私はこの課題に興味があり、これを要求したので共有する必要があると思いました。

おすすめ記事