我有以下代码可以在匹配后打印第一个单词。
输入
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
)。
答案 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 :(得分:1)
draw()
如果那不是您需要的,那么请编辑您的问题,以提供更具真实代表性的样本输入/输出。