나는 다음 코드를 작성했습니다.
#!/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
사용시awk
getline
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가 아닌 경우 리터럴 개행 문자를 삽입하는 것이 불가능하기 &
때문에 버퍼에 개행 문자를 다시 삽입하는 데 사용합니다 .\n
sed
섹션의 마지막/두 번째 줄에 항상 문자열이 포함되어 있는 경우 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을 사용하십시오.더 많은 정보를 알고 싶습니다.