sed -E 정규 표현식이 예상대로 작동하지 않습니다(.*?)

sed -E 정규 표현식이 예상대로 작동하지 않습니다(.*?)

모든 인터페이스의 IP 주소를 표시하기 위해 "ip a" 및 "sed" 파이프를 사용합니다.

ip a |sed -En "{N ; N ; s/^[1-9]: (.*: ).+\n?.+\n? {4}inet \
(([0-9]{1,3}[./]){4}[0-9]{1,2}).*/\1\2/p}"

그룹을 교체할 수 없는 이유

(([0-9]{1,3}[./]){4}[0-9]{1,2})

(.*\ )를 사용하여 대신 작성

ip a |sed -En "{N ; N ; s/^[1-9]: (.*?: ).+\n?.+\n? {4}inet \
(.*\ ).*/\1\2/p}"

일치하지만 줄 끝의 IP 주소 뒤의 공백만 찾아서 전체 줄을 \2로 인쇄합니다. "일반적인" 정규식에서는 이것이 작동합니다.

ip a의 출력은 다음과 같습니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000  
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
    inet 127.0.0.1/8 scope host lo  
       valid_lft forever preferred_lft forever  
    inet6 ::1/128 scope host   
       valid_lft forever preferred_lft forever  
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000  
    link/ether 10:78:d2:8e:e7:cf brd ff:ff:ff:ff:ff:ff  
    inet 192.168.1.44/24 brd 192.168.1.255 scope global dynamic eno1  
       valid_lft 41778sec preferred_lft 41778sec  
    inet6 fe80::1278:d2ff:fe8e:e7cf/64 scope link   
       valid_lft forever preferred_lft forever  
3: wlx68a3c45b2875: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000  
    link/ether 68:a3:c4:5b:28:75 brd ff:ff:ff:ff:ff:ff  
    inet 192.168.1.36/24 brd 192.168.1.255 scope global dynamic noprefixroute wlx68a3c45b2875  
       valid_lft 40457sec preferred_lft 40457sec  
    inet6 fe80::6aa3:c4ff:fe5b:2875/64 scope link   
       valid_lft forever preferred_lft forever  

답변1

문자열을 공백까지 일치시키려면 [^ ]* 전체 명령을 사용하십시오.

ip a |sed -En "{N ; N ; s/^[1-9]: (.*: ).+\n?.+\n? {4}inet \  
([^ ]*).*/\1\2/p}"

산출:

lo: 127.0.0.1/8    
eno1: 192.168.1.44/24    
wlx68a3c45b2875: 192.168.1.36/24    

관련 정보