sed - 점의 각 인스턴스 앞의 모든 숫자를 제거합니다.

sed - 점의 각 인스턴스 앞의 모든 숫자를 제거합니다.

다음 IP 범위 앞의 숫자를 제거하려고 합니다.

range 1.1.1.10 1.1.1.100;

다음 출력을 표시하고 싶습니다.

IP range is: 10-100

이 명령을 시도하면:

echo '  range 1.1.1.10 1.1.1.100;' | sed -rn '/^\s*range/ s/.*\.([0-9]{1,3})\s*.*\.([0-9]{1,3});/IP range is: \1-\2/p'

나는 얻다:

IP range is: 1-100

하지만 이 명령을 시도하면

echo '  range 1.1.1.10 1.1.1.100;' | sed -rn '/^\s*range/ s/.*\.([0-9]{1,3})\s*.*([0-9]{1,3});/IP range is: \1-\2/p'

나는 얻다:

IP range is: 10-0

내가 뭐 놓친 거 없니? 내가 보기에는 sed가 첫 번째 주소에 마지막 옥텟이 나타난 직후에 공백을 찾지 않는 것 같습니다.

답변1

당신의 문제는 탐욕과 관련이 있습니다 .*. Perl 에서도 이 작업을 수행할 수 있지만 sed더 쉽습니다.

$ echo 'range 1.1.1.10 1.1.1.100;' | perl -ne 'printf("IP range is %d-%d\n", (/\.(\d+)[^.]/g))'
IP range is 10-100

Perl 스크립트는 IP 주소 끝에 있는 숫자를 일치시키고 printf()형식화된 출력 문자열을 인쇄하기 위해 두 개의 정수로 반환합니다.

펄 정규식

/\.(\d+)[^.]/g

앞에 점이 있지만 뒤에 점이 나오지 않는 모든 숫자 세트를 캡처합니다.


sed실제로 한 번에 교체를 수행할 필요는 없습니다 .

$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/'
range 1.1.1.10 100

$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/' -e 's/[^ ]*\.([0-9]+) /\1-/'
range 10-100

$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/' -e 's/[^ ]*\.([0-9]+) /\1-/' -e 's/range/IP & is/'
IP range is 10-100

최종 sed스크립트:

s/[^ ]*\.([0-9]+);/\1/;   # Isolate last number in range
s/[^ ]*\.([0-9]+) /\1-/;  # Isolate first number in range, add dash
s/range/IP & is/;         # Sort out text at start

점검 후 단축 가능

s/[^ ]*\.([0-9]+)[^.]/-\1/g
s/range -/IP range is /

그건

$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+)[^.]/-\1/g' -e 's/range -/IP range is /'
IP range is 10-100

답변2

gnu sed를 사용해도 줄의 유효성이 제어되지 않습니다.

sed -E 's/.*\.(\S+)\s+.*\.(\S+);.*/IP range is: \1-\2/'

답변3

sed -r '/^[[:blank:]]*range[[:blank:]]+/ {
    s///                 # delete the previous match, "range"
    s/;.*//
    s/[[:digit:]]+\.//g  # remove digits followed by dot
    s/[[:blank:]]+/-/
    s/^/IP range is: /
}' <<END
range 1.1.1.10 1.1.1.100;
END
IP range is: 10-100

답변4

$ echo '   range 1.1.1.10 1.1.1.100;' |
  sed -Ene 's/^[[:blank:]]*range [0-9.]*\.([0-9]+) [0-9.]*\.([0-9]+);.*/IP range is: \1-\2/p'
IP range is: 10-100

부분:

^[[:blank:]]*        any blanks at start of line
[0-9.]*\.            numbers and dots, ending with a dot 
([0-9]+)             capture the following numbers
[0-9.]*\.([0-9]+)    same, again
\1  and  \2          put back the captured groups

s///p                print if the substitution matched 

관련 정보