wordで始まる行の末尾に、次のsed
コマンドが追加されます。 my_unix_admins
AllowGroups
/bin/sed -i '/^AllowGroups / s/$/ my_unix_admins/' /etc/ssh/sshd_config
my_unix_admins
アイテムが重複しないように行にまだ存在しない場合は、追加したいと思います。
つまり、その行に存在しない場合にのみ確認して追加します。
どうすればいいですか?
答え1
1つの方法は、最初にAllowGroups行を一致させ、次に行に「my_unix_admins」が含まれていない場合は、すでに存在する行末置換を実行することです。
sed '/^AllowGroups/ { /my_unix_admins/ !s/$/ my_unix_admins/; }' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new
これは以下を使用します。大きな括弧グループ "my_unix_admins" は AllowGroups 一致を検索します。ここでもう一つの重要な特徴は!
裏返すs//交換機能の実行ただオンラインでいいえ以前の範囲(ここで/ my_unix_admins /パターン検索)を一致させます。
GNU sedを使用すると仮定してGNU sedオンラインマニュアルに接続しましたが、中かっことリバース機能は次のとおりです。POSIXで指定したがって、ローカルのマニュアルページを確認することもできます。元のコマンドのPOSIX以外の唯一の機能は、-i
GNU sedでサポートされているオプションです。
私が想像できる唯一の極端なケースは、AllowGroups行に「astronomy_unix_admins」または「my_unix_admins_on_mars」というグループがある場合、単純な/my_unix_admins/パターンマッチングが間違って一致することです。潜在的な誤った一致を防ぐには、拡張正規表現(alternation |
)に対して次のオプションを有効にしてGNU sedを使用し、次のものを-E
使用できます。
sed -E '/^AllowGroups/ { / my_unix_admins( |$)/ !s/$/ my_unix_admins/; }' < /etc/ssh/sshd_config > /etc/ssh/sshd_config.new
2つの変更点は次のとおりです。
- グループ名の前にスペースが必要です。リストの最初のグループ、またはリストの別の場所にある場合はtrue。
- 末尾の空白(行の途中で誤った一致を防ぐ)または行末のマーク(これを行うと、グループが行の最後になる可能性があります)が必要です。