sed 또는 awk를 사용하여 두 줄 블록(고유 줄 뒤에 들여쓰기된 고유하지 않은 줄)을 어떻게 주석 처리합니까?

sed 또는 awk를 사용하여 두 줄 블록(고유 줄 뒤에 들여쓰기된 고유하지 않은 줄)을 어떻게 주석 처리합니까?

나는 다음 코드를 작성했습니다.

#!/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

내 코드에서 전체 두 줄 블록을 주석 처리하도록 하고 싶습니다.

#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

사용시awkgetline

awk '/^Match/ {$0="#"$0 ; print ; getline ; $0="#"$0 } 1' file

또는 자체(비)활성화 플래그를 설정하여:

awk '/^Match/ || b {$0="#$0" ; b=!b } 1' file

답변3

를 사용하면 라인 sed을 일치시키고 Match, 입력의 다음 라인을 버퍼에 추가하고, #두 라인의 시작 부분을 a로 바꿀 수 있습니다.

sed '/^Match Address 192\.168\.18\.109/ { N; s/^/#/; s/\n/&#/; }' file

여기에서는 N다음 입력 줄이 버퍼에 추가되고 구분 개행 문자가 두 줄을 구분하는 데 사용됩니다. 첫 번째 대체는 #첫 번째 줄의 시작 부분에 1을 추가하고, 두 번째 대체는 다음 줄의 시작 부분에 1을 추가합니다. GNU가 아닌 경우 리터럴 개행 문자를 삽입하는 것이 불가능하기 &때문에 버퍼에 개행 문자를 다시 삽입하는 데 사용합니다 .\nsed

섹션의 마지막/두 번째 줄에 항상 문자열이 포함되어 있는 경우 PubkeyAuthentication단일 바꾸기 명령으로 범위 주소를 사용할 수도 있습니다 .

sed '/^Match Address 192\.168\.18\.109/,/PubkeyAuthentication/ s/^/#/' file

/^/범위가 다음 줄까지만 실행되도록 하려면 실제로 두 번째 패턴을 다음과 같이 바꿀 수 있습니다.

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을 사용하십시오.더 많은 정보를 알고 싶습니다.

관련 정보