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

おすすめ記事