두 문자열 사이의 문자열을 일치시키는 Bash 정규 표현식

두 문자열 사이의 문자열을 일치시키는 Bash 정규 표현식

저는 nslookup -q=srv SOME_ADDRESS반환된 주소를 배열에 사용하고 저장하고 싶습니다. nslookup반품:

Server:   123.456.789.123
Address:  123.456.789.123#12

SOME_ADDRESS  service = 0 0 1234 address-1.i.want.
SOME_ADDRESS  service = 0 0 1234 address-2.i.want.
SOME_ADDRESS  service = 0 0 1234 address-3.i.want.

저는 아직도 정규식을 배우고 있으며 문자열을 배열에 넣습니다.

array=($(nslookup -q=srv SOME_ADDRESS | grep -o ' [a-z0-9.-]*[a-z0-9].$'))

이것은 나에게 빈 공간을 제공합니다 [ ]address-3.i.want..[ ]

adress-3.i.want.시작이나 끝 부분에 공백이 없으면 어떻게 일치시키나요? (결과 문자열에서 문자를 제거하는 대신 정규식을 사용하십시오. 다른 문자열을 추가 grep하거나 cut파이프하는 방법을 알고 있지만 정규식을 편집하여 원하는 작업을 수행할 수 있다고 확신합니다.)

답변1

GNU로 작업을 수행할 수 있습니다.sed

nslookup -q=srv "${SOME_ADDRESS}" | 
sed -n '/\.$/s///;T;/.* /s///p' | 
mapfile -t array

존재하다sed

  • -n기본적으로 줄은 인쇄되지 않습니다.
  • /\.$/s///줄 끝의 "."를 제거하세요.
  • T끝으로 이동(위의 내용이 발생하지 않으면 아무 것도 인쇄되지 않음을 의미)
  • /.* /s///p인쇄물이 남을 때까지 모두 삭제

또는 비 GNU

sed -n '/ /s//\n/;/\n/D;s/\.$//p'
  • / /s//\n/n대신 ewline을 사용하세요
  • /\n/Dewline 까지 모두 삭제 n하고 처음부터 시작
  • s/\.$//p"."을 제거하면 줄 끝에 남은 내용이 인쇄됩니다.

답변2

마침표를 일치시키려면 이스케이프 처리하거나 대괄호로 묶어야 합니다. 초기 공백을 제외하려면 정규식에 전혀 추가하지 마세요. 단, 공백이 아닌 잘못된 문자 뒤에 있는 텍스트를 선택할 위험이 있습니다. 마지막으로 (0개 이상의 일치 항목) 뒤에 지정된 일치 항목을 사용하는 +대신(즉, 최소 하나의 일치 항목)을 사용하는 경우 숫자 선택을 여러 번 포함할 필요가 없습니다 .*

array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$'

위 정규식에서는 대문자와 밑줄이 제외됩니다. 필요한 경우 [:alnum:]유효한 기호를 사용할 수 있습니다.

array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'

관련 정보