bash 변수의 각 줄에 정규식 패턴이 나타나기 전에 모든 것을 삭제하는 방법

bash 변수의 각 줄에 정규식 패턴이 나타나기 전에 모든 것을 삭제하는 방법

IP 주소를 포함하여 여러 줄의 텍스트가 포함된 bash 변수가 있고 같은 줄에서 IP 주소가 마지막으로 나타나기 전에 "모든 항목"을 제거해야 합니다.

이것:

43.12.40.53 [email protected]
archery-666.foobar.com  66.77.11.44 data test@example
55.32.39.153    [email protected]
5.113.30.37 dummy
89-109-22-006.static.example.com.br 89.109.22.6 [email protected]
68.28.15.55 68.28.15.55 another

다음과 같이 변환되어야 합니다.

43.12.40.53 [email protected]
66.77.11.44 data test@example
55.32.39.153    [email protected]
5.113.30.37 dummy
89.109.22.6 [email protected]
68.28.15.55 another

이 기사를 읽어보세요행에서 한 패턴 앞의 모든 항목과 다른 패턴 뒤의 모든 항목을 제거하는 방법은 무엇입니까?나는 시도했다:

var=$(sed 's/^.*\(([0-9]{1,3}[\.]){3}[0-9]{1,3}\).*$/\1/' <<< "$var")

하지만 작동하지 않습니다.

답변1

몇 가지 질문이 있습니다:

  1. BRE와 ERE를 혼합하고 있습니다( \(예를 들어 그룹화와 반대).(

  2. .*IP 뒤의 모든 내용을 결과에 포함하려면 마지막에 캡처 그룹 내에 있어야 합니다.

  3. ^.*선행 IP 번호를 제외한 모든 문자를 포함하여 가능한 한 많은 문자를 탐욕스럽게 소비합니다.

또한, .내부적으로 이스케이프할 필요도 없습니다 [] . 하지만 이로 인해 아무 문제가 발생하지는 않습니다.

sed( perl말한 것과 달리) 탐욕스럽지 않은 수정자가 없는 (3)을 처리하는 올바른 방법이 확실하지 않습니다 . 단어 경계 앵커를 추가하면 \b작동하는 것 같지만 취약한 느낌이 듭니다.

그래서 (BRE)

sed 's/^.*\(\b\([0-9]\{1,3\}[.]\)\{3\}[0-9]\{1,3\}.*$\)/\1/' <<< "$var"

또는 (ERE)

sed -E 's/^.*(\b([0-9]{1,3}[.]){3}[0-9]{1,3}.*$)/\1/' <<< "$var"

답변2

첫 번째 대괄호를 올바르게 이스케이프했지만 두 번째 대괄호나 {}이스케이프해야 하는 대괄호는 올바르게 이스케이프하지 않았습니다. 또한 .*$필요하지 않은 줄 끝까지( ) 까지 모든 항목을 일치시킵니다 . 정규식을 사용하면 원하는 작업이 수행됩니다.

$ sed 's/^.*\(\([0-9]\{1,3\}[\.]\)\{3\}[0-9]\{1,3\}\)/\1/' <<< "$var"
3.12.40.53 [email protected]
6.77.11.44 data test@example
5.32.39.153    [email protected]
5.113.30.37 dummy
9.109.22.6 [email protected]
8.28.15.55 another

그러나 이것은 여전히 ​​필요 이상으로 복잡합니다. 예를 들어, 필요하지 않으며 [\.]간단한 것만으로도 \.충분합니다. 이 -E플래그를 사용하여 확장 정규식을 활성화하고 구문을 단순화할 수 있습니다.

$ sed -E 's/^.*(([0-9]{1,3}\.){3}[0-9]{1,3})/\1/' <<< "$var"
3.12.40.53 [email protected]
6.77.11.44 data test@example
5.32.39.153    [email protected]
5.113.30.37 dummy
9.109.22.6 [email protected]
8.28.15.55 another

하지만,스틸 드라이버가 지적했듯이, 프리앰블이 .*예상보다 더 많이 소비할 수 있으므로 Perl에서 모든 작업을 수행하는 것이 더 안전합니다.

$ perl -pe 's/^.*?(([\d]{1,3}\.){3}\d{1,3})/\1/' <<< "$var"
43.12.40.53 [email protected]
66.77.11.44 data test@example
55.32.39.153    [email protected]
5.113.30.37 dummy
89.109.22.6 [email protected]
68.28.15.55 68.28.15.55 another

관련 정보