在匹配之后打印第一个单词,即第一个单词在另一个匹配之前

时间:2018-03-24 16:47:16

标签: regex bash awk sed grep

我有以下代码可以在匹配后打印第一个单词。

输入

MY_TYPE_A_T -- stuff, other stuff, more stuff, ..., Array of MY_TYPE_T in random.h

命令

    sed -n 's/.*Array of //p' \ # matches Array of
      | cut -d ' ' -f 1         # prints first word after Array of

输出

MY_TYPE_T

这很好用,但问题是当我收到一个带有n维数组的输入行时:

MY_TYPE_A_T -- stuff, other stuff, more stuff, ..., Array of Array of MY_TYPE_T in random.h

如果我单独留下代码,那么当我真正想要Array时,它会打印MY_TYPE_T。请记住,输入行也可以是Array of Pointer to Struct of Array of Pointer to, ..., MY_TYPE_T in random.h

我想要做的就是在in之前打印第一个单词,但前提是在Array of匹配后才会出现。

是否有一种优雅的方式可以在匹配(MY_TYPE_T)之后在另一场比赛(Array of)之前打印第一个单词(in)。

2 个答案:

答案 0 :(得分:2)

sed -nre 's/.*Array of.*\s(\S*)\s+in\s.*/\1/p'

说明:-r指定使用扩展正则表达式。更易读,更便携。

第一个贪婪的捕获(.*)会吃任何东西,所以它会占用Array of的最后一个实例的所有文本。然后,我们在Array of尝试捕获由空格((\S+))包围的连续非空白字符(\s)的任何部分之后吃掉部分,然后是{{1}更多的空格,然后是直到行尾的任何东西。然后我们打印捕获(in)。

如果需要在\1/p后面有文件名,如果这些部分需要在最后,或者类型/文件名可能包含什么,那么您的描述并不清楚。另外,你真的应该尝试

  1. 更好地写下问题。例如。
    • 你对最终想要的内容有一个很好的总结,最好放在文本的早期(人们,特别是工程师,都是懒惰的。他们不会读到比他们认为需要更多的内容,以便回答这个问题。)
    • 包含更多/更好的例子。
  2. 在回复中保持建设性和尊重。诸如“阅读不是那么难,老兄”这样的评论不太可能为你赢得许多赞成......

答案 1 :(得分:1)

draw()

如果那不是您需要的,那么请编辑您的问题,以提供更具真实代表性的样本输入/输出。