我花了一些时间试图找到这个问题的答案,但没有运气......
我正在编写一个脚本,它接受一个字符串作为输入,然后在 cvs 日志中搜索匹配项。输出应该是匹配字符串之前的文件名。我可以编写一个正则表达式来匹配文件名,没有任何问题,但是我不确定如何在匹配后查找最后一次出现的正则表达式...
显然,cvs 日志中有许多文件我将要解析,并且文件名和输入字符串之间的行数未知,因此无法执行“grep -B4”等操作...
下面的示例(删除了不相关位的 cvs 日志)- 需要匹配一个字符串(将作为脚本的输入给出(例如 120233))并检索与其关联的文件名,此处为 (Aliases.xml) 。正如我所说,有很多文件,因此尽管正则表达式会匹配许多文件名,但我只对匹配字符串之前的文件名感兴趣。
这是我第一次在这里发帖,我是编程新手,所以我希望这是有道理的。
----------
RCS file: /user1/cvs/Aliases.xml
revision 1.18
date: 2015/03/13 16:21:07;
FIX - 217427 - fixed error....
revision 1.17
date: 2013/03/27 08:03:36;
IMPROVEMENT - 120233 - some improvement
最佳答案
您可以使用 awk
命令来执行此操作:
cvs log | awk -F '[:, ]+' -v s='120233' '/RCS file:/{f=$3} f && $0 ~ s{print f; f=""}'
说明:
-F '[:, ]+' # make one or more of colon, comma or <space> a field saprator
-v s='120233' # pass search string to awk in variable s
/RCS file:/ # search for string "RCS file:"
{f=$3} # store filename in variable f
f && $0 ~ s # if f is NOT_EMPTY and line matches variable s
print f; f="" # print filename from variable f and set f to EMPTY
关于regex - 使用 grep (Bash) 找到匹配项后打印上一次出现的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31710066/