예시 라인:
04/07/2016 11:23:44 [8344] BDFDD123A Some Text Here (Word: ABD_ABDCD, Word: Word, Word: Word Word-ABCAbcAbc-HOSTNAME.DOMAINNAME.COM-ASDF).
"HOSTNAME.DOMAINNAME.COM-ASDF" 부분을 추출하고 싶습니다.
"HOSTNAME" 부분 앞에는 항상 "-"가 오고 줄은 항상 "."으로 끝납니다. 하지만 항상 그런 것은 아닙니다.")."
각 줄에 대해 1.) 문자열 ".COM"을 찾은 다음 2.) 이전 "-"로 돌아가서 다음 "."으로 진행한다고 말할 수 있을 것 같습니다. 그 사이에 모든 것을 제공하지만 ... 어떻게 해야할지 모르겠습니다.
일반적으로 나는 일종의 구분 기호를 사용하여 분할하려고 시도하지만 한 줄에 동일한 수의 구분 기호를 사용하지는 않습니다. 이 문제를 해결하는 방법을 아시나요?
답변1
grep
PCRE()와 함께 사용 -P
:
grep -Po -- '-\K[^-]+\..*?(?=(?:\)|)\.$)' file.txt
-
a를 일치시키고-
일치\K
항목을 폐기합니다.[^-]+\..*?
필수 하위 문자열과 일치너비가 0인 긍정적 예측 모드는
(?=(?:\)|)\.$)
일치 항목이 줄 끝).
이나 그 근처에 있는지 확인합니다.
.
예:
$ grep -Po -- '-\K[^-]+\..*?(?=(?:\)|)\.$)' <<<'04/07/2016 11:23:44 [8344] BDFDD123A Some Text Here (Word: ABD_ABDCD, Word: Word, Word: Word Word-ABCAbcAbc-HOSTNAME.DOMAINNAME.COM-ASDF).'
HOSTNAME.DOMAINNAME.COM-ASDF
답변2
-ASDF 부분을 유지하려면
sed -E 's/.*-(.*-[^)]*)\)?\.$/\1/'
-ASDF 부분에 신경 쓰지 않는다면 더 간단합니다.
sed 's/.*-\(.*\)-.*/\1/' x
이는 먼저 "욕심"을 가지면 달성됩니다..*