regex - 从文本文件中的重复范围模式中获取特定行

标签 regex perl sed awk pattern-matching

哇,这在标题中听起来如此复杂,但我认为并非如此。

我有基本上具有这种布局的文本文件:

Stimulus ...
...
...
...
Response
Stimulus ...
...
...
...
Response

我使用 sed 来获取两者之间的所有内容,然后进一步提取我需要的信息。
sed -n -e '/Stimulus/,/Response/ p'

但是,有时参与者没有响应,在这种情况下,文件如下所示:
Stimulus ...
...
...
...
Stimulus ...
...
...
...
Response

在这种特殊情况下,我的脚本将无法获得我正在寻找的内容。因此,我正在寻找一种方法来提取信息,当且仅当模式 1 后跟模式 2 而不是模式 1 时。

如果我表述不清楚,请告诉我。我更乐意提供进一步的信息。

最佳答案

一种肮脏的方法,虽然它在我的测试中似乎有效,但可能是反转文件内容,从 Response 搜索至 Stimulus并再次反转结果。

假设以下输入数据:

Stimulus 1...
...
...
...
Stimulus 2...
...
...
...
Response 2
Stimulus 3...
...
...
...
Response 3
Stimulus 4...
...
...
...
Stimulus 5...

命令:
tac infile | sed -ne '/Response/,/Stimulus/ p' | tac -

产量:
Stimulus 2...
...
...
...
Response 2
Stimulus 3...
...
...
...
Response 3

编辑 :以隔离 Response 为例部分。需要过滤两次(基于 OP 的评论):
tac infile | 
  sed -ne '/Response/,/Stimulus/ p' | 
  tac - | 
  sed -ne '/Stimulus/,/Response/ p'

关于regex - 从文本文件中的重复范围模式中获取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17365980/

相关文章:

java - 正则表达式匹配 2 个或 3 个单词,但不匹配 1 个单词

algorithm - 比较字符串并删除 Perl 中更通用的模式

perl - 设置钻石运算符(operator)在 bin 模式下工作?

perl - 为什么 DBD::SQLite 不能通过我的 Perl CGI 脚本插入数据库?

javascript - 正则表达式javascript搜索单词但忽略几个单词

python - 在 Python 中生成与 RegEx 匹配的字符串

SQL解析数字数据的列字符串并存储在单独的列中

linux - 流式传输文件内容直到遇到子字符串

bash - 在 virsh 或 sudoers 的脚本中将 sed 与 EDITOR 变量一起使用

linux - 有没有办法在 Unix 中删除文件中的重复 header ?