sedで正規表現を使用する方法は?

sedで正規表現を使用する方法は?

スクリプトで sed を使用するユーザーに対する sudo アクセス権を取り消す必要があります。
行に/ bin / suが含まれている場合にのみ、ユーザーにコメントを付けたいと思います。 - root
最初の行にのみコメントを付ける必要がある次のファイルを考えてみましょう。

mindadmin  ALL = NOPASSWD: /bin/su - root
mindadmin  ALL = NOPASSWD: /bin/ifconfig

私が使用したコマンドはsed次のとおりです。

sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin  ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers 

しかし、うまくいきません。文法的なエラーがありますか?

答え1

2つの問題があります。最初のものはsudoershasmindadminとmode minadmin(nothing d)です。

2番目の問題は、/sの/bin/su正規表現で次をエスケープする必要があることです。

sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin  ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers

それ以外の場合、パターンは終了します。

代わりに別の区切り文字を選択することもできます。/ファイルにその区切り文字が表示されない限り、エスケープする必要はありません。

答え2

 sed  '/\/bin\/su - root/ s/^/#/'  filename

ファイル名に含まれる行を見つけ、行の先頭/bin/su - rootにコメント(#)(^)を追加します。

ファイルに影響を与えるようにsedにオプションを追加します-i

答え3

/bin/su - root行末を含むすべての行をコメントアウトするには、sed式を単純化するだけです。

sed 's/.*\/bin\/su - root$/#&/'

またはもっと簡単に

sed 's,.*/bin/su - root$,#&,'

/bin/su - root包含行のすべての行をコメントアウトするには、次のようにします。

sed 's,.*/bin/su - root,#&,'

答え4

&一致するパターン全体が置き換えられるため、別の回避策は次のとおりです。

sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers

/別の区切り文字に置き換えられるので、エスケープする必要はありません。 suコマンドの後の間隔が異なる場合でも、このモードはより柔軟です。

最小値のみ変更する場合D管理者ユーザー:

sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers

フラグ -i は変更をファイルに直接適用します。

関連情報