私は次のコードを書いた。
#!/usr/bin/bash
wireless_state=$(ip l |grep "3: wlp" |sed -E 's/^.*state ([DOWNUP]{2,4}).*/\1/')
ethernet_state=$(ip l |grep "2: en" |sed -E 's/^.*state ([DOWNUP]{2,4}).*/\1/')
if [[ $ethernet_state == "DOWN" ]]; then
sed -i 's/^Match Address 192.168.18.109/#Match Address 192.168.18.109/;s/^Match Address 192.168.18.112/#Match Address 192.168.18.112/' sshdc
fi
sshdc
コピーはどこで見つけることができますか/etc/ssh/sshd_config
?私の尾/etc/ssh/sshd_config
は次のとおりです
#Match Address 192.168.18.103
#PubkeyAuthentication yes
Match Address 192.168.18.109
PubkeyAuthentication yes
#Match Address 192.168.18.111
#PubkeyAuthentication yes
Match Address 192.168.18.112
PubkeyAuthentication yes
私のコードで2行のブロック全体をコメントアウトするようにしたいと思います。
#Match Address 192.168.18.109
# PubkeyAuthentication yes
そして、これまで私のコードには、次のようにブロックの最初の行だけがコメントアウトされています。
#Match Address 192.168.18.109
PubkeyAuthentication yes
as行はMatch Address 192.168.18.109
一意ですが、PubkeyAuthentication yes
ファイルのPubkeyAuthentication no
頭の部分のどこかにインデントされていない行もあります。または他のGNU / Linuxユーティリティを使用してこれらのタスクをどのようにsed
実行できますかawk
?この質問の範囲を超えて、Pythonのソリューションを維持してください。
答え1
少なくともGNU sed(GNU / Linuxのデフォルト)の場合は使用できます。アドレス範囲形
addr1,+N Matches addr1 and the N lines following addr1.
例えば
$ sed '/^Match Address 192\.168\.18\.109/,+1s/^/#/' sshdc
#Match Address 192.168.18.103
#PubkeyAuthentication yes
#Match Address 192.168.18.109
# PubkeyAuthentication yes
#Match Address 192.168.18.111
#PubkeyAuthentication yes
Match Address 192.168.18.112
PubkeyAuthentication yes
答え2
awk
使用時getline
awk '/^Match/ {$0="#"$0 ; print ; getline ; $0="#"$0 } 1' file
または独自の(非)アクティブ化フラグを設定することで:
awk '/^Match/ || b {$0="#$0" ; b=!b } 1' file
答え3
を使用すると、行をsed
一致させMatch
、入力の次の行をバッファに追加し、2#
行の先頭をaに置き換えることができます。
sed '/^Match Address 192\.168\.18\.109/ { N; s/^/#/; s/\n/&#/; }' file
ここでは、N
次の入力行がバッファに追加され、区切り改行文字が2行を区切るために使用されます。最初の置換は#
最初の行の先頭に1を追加し、2番目の置換は次の行の先頭に1を追加します。 GNU以外の場合、リテラル改行文字を挿入することは不可能であるため、&
バッファに改行文字を再挿入するために使用します。\n
sed
セクションの最後/2行目に常に文字列が含まれている場合は、PubkeyAuthentication
単一置換コマンドで範囲アドレスを使用することもできます。
sed '/^Match Address 192\.168\.18\.109/,/PubkeyAuthentication/ s/^/#/' file
/^/
範囲が次の行までのみ実行されるようにするには、実際には2番目のパターンを次のように置き換えることができます。
sed '/^Match Address 192\.168\.18\.109/,/^/ s/^/#/' file
答え4
すべてのUnixシステムのシェルでawkを使用すると、次のコマンドを使用して一致する行から始めて、必要な数の行を変更できます。または、希望の番号c=2
に変更できます。c=37
$ awk '/^Match Address 192\.168\.18\.109/{c=2} c&&c--{$0="#"$0} 1' file
#Match Address 192.168.18.103
#PubkeyAuthentication yes
#Match Address 192.168.18.109
# PubkeyAuthentication yes
#Match Address 192.168.18.111
#PubkeyAuthentication yes
Match Address 192.168.18.112
PubkeyAuthentication yes
バラより印刷には sed- または awk-a-line-follow-a-matching-pattern を使用します。より多くの情報を知りたいです。