grep - 正则表达式 - 匹配到特定单词

the*_*eye 2 regex bash grep

可以说我有一个像这样的行的文件

abcefghijklxyz
abcefghijkl
Run Code Online (Sandbox Code Playgroud)

我想只获得abc行之间和行尾的字符串.行的结尾可以定义为正常的行尾或字符串xyz.

我的问题是

如何只使用匹配的字符串grep和正则表达式?例如,上面显示的两条线的预期输出将是

efghijkl
efghijkl
Run Code Online (Sandbox Code Playgroud)

我不想要开始和结束标记.

我到现在为止做了什么

grep -oh "abc.*xyz"
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu 13.04和Bash shell.

Ken*_*ent 6

这条线斩断前进abc结束 xyz(如果有),并为您提供所需的部分:

grep -oP '^abc\K.*?(?=xyz$|$)'
Run Code Online (Sandbox Code Playgroud)

用你的例子:

kent$  echo "abcefghijklxyz
abcefghijkl"|grep -oP '^abc\K.*?(?=xyz$|$)'
efghijkl
efghijkl
Run Code Online (Sandbox Code Playgroud)

xyz在文本中间的另一个例子:

kent$  echo "abcefghijklxyz
abcefghijkl
abcfffffxyzbbbxyz
abcffffxyzbbb"|grep -oP '^abc\K.*?(?=xyz$|$)'
efghijkl
efghijkl
fffffxyzbbb
ffffxyzbbb
Run Code Online (Sandbox Code Playgroud)

  • 欢迎downvote,只有在有解释的情况下,才能让人们了解为什么解决方案不够好(或不好).Downvoter,你会发一个简短的评论吗? (4认同)
  • @Alfe http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions然后搜索`\ K`键入它比`(?<= ..)`;更容易 (3认同)