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
몇 가지 질문이 있습니다:
BRE와 ERE를 혼합하고 있습니다(
\(
예를 들어 그룹화와 반대).(
.*
IP 뒤의 모든 내용을 결과에 포함하려면 마지막에 캡처 그룹 내에 있어야 합니다.^.*
선행 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