sed: -e 式 #1、文字 44: 終了していないアドレス正規表現

sed: -e 式 #1、文字 44: 終了していないアドレス正規表現

質問:

Debian インストールを構成するためのスクリプトを作成しています。 sedを使用しようとしています。行を削除する方法を知っていますが、必要な行があります。コメントアウトされます。

私が持っているのはこれです:

sed -i '/deb cdrom:[Debian GNU/Linux 9.4.0 _S/s/^/#/' /etc/apt/sources.list

ただし、次のエラーが発生します。

sed: -e expression #1, char 44: unterminated address regex

どうやらブラケットに問題があるようですね。

質問:

ここで問題は何であり、このコマンドをどのように修正できますか?そして/またはこれを行う他の方法はありますか?

答え1

この試み、

  sed -i '/deb cdrom:\[Debian GNU\/Linux 9\.4\.0 _S/s/^/#/' /etc/apt/sources.list
  • [/およびは区切り文字で正規表現演算子であるため、検索パターンからエスケープする必要があります。./[.

答え2

検索文字列は定数で正規表現のメタ文字がある場合は問題になるため、次のようにこれを行うこともできます。

 awk -i inplace 'index($0, "deb cdrom:[Debian GNU/Linux 9.4.0 _S"){$0 = "#" $0}1' /etc/apt/sources.list

GNU awk4.1.0以上を使って内部編集効果を得ることができれば幸いです。 OTW、次のようにすることができますPerl

perl -pi -e 's/^/#/ if index($_, "deb cdrom:[Debian GNU/Linux 9.4.0 _S") + 1' /etc/apt/sources.list

関連情報