示例行:
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
丢弃匹配[^-]+\..*?
匹配所需的子字符串零宽度正前瞻模式
(?=(?:\)|)\.$)
确保匹配位于行尾).
或.
行尾。
例子:
$ 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
这是通过首先“贪婪”来实现的.*