awk - 匹配字符串,但只输出它下面的行+不是匹配的字符串本身
问题描述
我需要找到一种方法来选择指定字符串下方的行,在这种情况下,是包含函数的字符串"y"
- 但我不想选择字符串"y"
本身,以防彼此下方有多行"y"
。
所以我基本上想要的是选择所有包含"new o"
但我不想选择字符串正上方的“新o”的行"y("
,这就是我的意思。
我有一个包含这个的文件;
new o85 = x(-1.3);
y(o85, 12.0, 91.2, 5);
y(o85, 12.0, 91.2, 6);
y(o85, 12.0, 91.2, 7);
new o86 = x(-1.3);
new o87 = x(-1.3);
y(o87, 12.0, 91.2, 9);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o90 = x(-1.3);
y(o90, 12.0, 91.2, 3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o96 = x(-1.3);
y(o96, 12.0, 91.2, 3);
new o97 = x(-1.3);
new o98 = x(-1.3);
new o99 = x(-1.3);
我想选择这些特定的行;
new o86 = x(-1.3);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o97 = x(-1.3);
new o98 = x(-1.3);
new o99 = x(-1.3);
我将如何继续做这样的事情?
我试图找到重复的问题,但我不完全确定要搜索什么,如果重复,我深表歉意。
提前致谢。
解决方案
GNU grep:
grep -zoP 'new o.*?(\n|$)(?!y\()'
或这个:
grep -zoP 'new o.*?;(?!\ny\()'
GNU awk:
$ awk -v RS="\n*y[^)]*);\n*" -F"\n" 'NF>1{for(i=1;i<NF;i++) print $i}' file
new o86 = x(-1.3);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o97 = x(-1.3);
new o98 = x(-1.3);
对于 windows 回车 ( \r\n
) 结束文件:
awk -v RS="[\r\n]*y[^)]*);[\r\n]*" -F"[\r\n]+" 'NF>1{for(i=1;i<NF;i++) print $i}'
推荐阅读
- python - 从 Python 的字典创建 JSON 对象
- android - RecyclerView 在嵌套的 Recycler 视图中重复按后按
- java - 正则表达式模式用空白替换错误的占位符
- go - 该进程无法访问该文件,因为它正在被 Golang 中的另一个进程使用
- python - 在 Python 中对二进制数字进行分组
- c# - 将 ServiceClientCredentials 作为参数传递给 C# 中的构造函数
- vue.js - 如何在酒树中将拖放限制在同一级别?
- javascript - 用于删除背景图像的引导类
- reactjs - 使用 React 16.8^ 编码风格从子组件获取状态变量
- c# - Serilog - 如何使用颜色执行 logger.Information("string")?