rgu*_*guy 2 regex awk grep sed
给定一段文本可以跨越不同数量的行,我需要使用grep,sed或awk解决方案来搜索相同模式的许多文件并获取正文中的最后一个单词.
文件可以包含这些格式,其中我想要的单词可以命名为任何名称
call function1(input1,
input2, #comment
input3) #comment
returning randomname1,
randomname2,
success3
call function1(input1,
input2,
input3)
returning randomname3,
randomname2,
randomname3
call function1(input1,
input2,
input3)
returning anothername3,
randomname2, anothername3
Run Code Online (Sandbox Code Playgroud)
我需要打印出结果
success3
randomname3
anothername3
另外,我需要一些关于每个的文件名和行信息.
我试过了
pcregrep -M 'function1.*(\s*.*){6}(\w+)$' filename.txt
Run Code Online (Sandbox Code Playgroud)
这太贪婪了,我仍然需要打印出特定的分组值,而不是整个模式.function1我的示例代码中的单词和返回将始终以此命名,并且可以在我的表达式中进行硬编码.
最后一个代码块
使用awk的记录分隔符在块中拆分文件RS.记录将被定义为文本块,记录由双换行符分隔.
记录由字段组成,每两个连续字段由空格或单个换行符分隔.
现在我们要做的就是打印每条记录的最后一个字段,产生以下代码:
awk 'BEGIN{ FS="[\n\t ]"; RS="\n\n"} { print $NF }' file
Run Code Online (Sandbox Code Playgroud)
说明:
FS这是字段分隔符,设置为换行符,制表符或空格:[\n\t ].RS 这是记录分隔符,设置为doulbe换行符: \n\nprint $NF这将打印$带索引的字段,索引NF是包含字段数的变量.因此,这将打印最后一个字段.注意:要捕获所有段落,文件应以双换行结束,这可以通过使用以下方式预处理文件轻松实现:$ echo -e '\n\n' >> file.
基于评论的替代解决方案
更优雅的简单解决方案如下:
awk -v RS='' '{ print $NF }' file
Run Code Online (Sandbox Code Playgroud)