文字列の前後の行の一部を抽出する

文字列の前後の行の一部を抽出する

例示ライン:

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行に同じ数の区切り文字を使用しません。この問題を解決する方法を知っていますか?

答え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   

これは、まず「欲望」を持つことで達成されます。.*

関連情報