regex - 使用 grep (Bash) 找到匹配项后打印上一次出现的正则表达式

标签 regex string bash awk grep

我花了一些时间试图找到这个问题的答案,但没有运气......

我正在编写一个脚本,它接受一个字符串作为输入,然后在 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/

相关文章:

java - 为什么 Java String indexOf 失败了?

python - 从字符串列表中删除空白字符串值

c - 如何使用带有 Linux 子系统的 GCC 为 Windows 编译可执行文件?

bash - 在 "vagrant ssh"时自动 chdir 到 vagrant 目录

mysql - 标题中特定日期的正则表达式

php - 如何在 PHP 中使用正则表达式匹配空格、回车和换行?

javascript - 用正则表达式匹配 if/else 语句

c++ - 在 stringstream 的 ssh 命令中转义 bash 脚本中的引号

.net - 用于选择 INI 部分的正则表达式仅选择 .NET 中的部分标题

linux - 在文件中找到特定行并提取其中的一部分