提取字符串前后的行的一部分

提取字符串前后的行的一部分

示例行:

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   

这是通过首先“贪婪”来实现的.*

相关内容