sedまたはawkを使用して2行ブロック(固有行の後にインデントされた一意でない行)をどのようにコメントアウトしますか?

sedまたはawkを使用して2行ブロック(固有行の後にインデントされた一意でない行)をどのようにコメントアウトしますか?

私は次のコードを書いた。

#!/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以外の場合、リテラル改行文字を挿入することは不可能であるため、&バッファに改行文字を再挿入するために使用します。\nsed

セクションの最後/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 を使用します。より多くの情報を知りたいです。

関連情報