例示ライン:
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
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
これは、まず「欲望」を持つことで達成されます。.*