And*_*rej 6 regex perl awk sed pattern-matching
哇,这在标题中听起来如此复杂,但我认为并非如此.
我有基本上这种布局的文本文件:
Stimulus ...
...
...
...
Response
Stimulus ...
...
...
...
Response
Run Code Online (Sandbox Code Playgroud)
我使用sed获取介于两者之间的所有内容,然后进一步提取我需要的信息.
sed -n -e '/Stimulus/,/Response/ p'
Run Code Online (Sandbox Code Playgroud)
但是,有时参与者不响应,在这种情况下文件看起来像这样:
Stimulus ...
...
...
...
Stimulus ...
...
...
...
Response
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,我的脚本将无法获得我想要的内容.所以,我正在寻找一种方法来提取信息,当且仅当pattern1后面跟着pattern2,而不是pattern1.
让我知道,如果我表达不清楚.我更乐意提供进一步的信息.
一个肮脏的方式,但它似乎在我的测试工作,可能是扭转文件内容,从搜索Response到Stimulus,并再次逆转的结果.
假设输入数据如下:
Stimulus 1...
...
...
...
Stimulus 2...
...
...
...
Response 2
Stimulus 3...
...
...
...
Response 3
Stimulus 4...
...
...
...
Stimulus 5...
Run Code Online (Sandbox Code Playgroud)
命令:
tac infile | sed -ne '/Response/,/Stimulus/ p' | tac -
Run Code Online (Sandbox Code Playgroud)
产量:
Stimulus 2...
...
...
...
Response 2
Stimulus 3...
...
...
...
Response 3
Run Code Online (Sandbox Code Playgroud)
编辑:有关隔离Response部件的示例.有两次过滤(根据OP的评论):
tac infile |
sed -ne '/Response/,/Stimulus/ p' |
tac - |
sed -ne '/Stimulus/,/Response/ p'
Run Code Online (Sandbox Code Playgroud)
这是一个纯粹的bash解决方案:
tmp=()
while read l; do
[[ $l =~ ^Stimulus ]] && tmp=("$l") && continue
[ ${#tmp[@]} -eq 0 ] && continue
tmp+=("$l")
[[ $l =~ ^Response ]] && printf "%s\n" "${tmp[@]}" && tmp=()
done <infile
Run Code Online (Sandbox Code Playgroud)
tmp如果列表以Stimulusfound 开头,它会开始填充数组.如果另一个Stimulus到达,它只是清除tmp并再次启动工作.如果Response找到,则打印tmp数组的内容.实际上printf内置的是一个隐式循环.
输入:
cat >infile <<XXX
...
Response 0
...
Stimulus 1
...
Stimulus 2
...
Response 2
...
Stimulus 3
...
Response 3
...
Response 4
XXX
Run Code Online (Sandbox Code Playgroud)
输出:
Stimulus 2
...
Response 2
Stimulus 3
...
Response 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |