문자열 앞과 뒤의 줄 일부 추출

문자열 앞과 뒤의 줄 일부 추출

예시 라인:

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

grepPCRE()와 함께 사용 -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   

이는 먼저 "욕심"을 가지면 달성됩니다..*

관련 정보