假设我有:
Z 10
Z 11
Y 10
我用过:
$ grep "Z" <above_file> -A 1
Z 10
Z 11
Y 10
我怎样才能让它返回:
Z 10
Z 11
Z 11
Y 10
本质上,如果grep
看到下一行也与模式匹配,我希望它重复。是最好的/唯一的解决方案是手动逐行或使用带条件的复杂awk
语句?在这一步之后还有进一步的处理,但这是阻碍我的边缘情况。
答案 0 :(得分:1)
尝试:
$ awk 'f{print; f=0} /Z/{print; f=1}' file
Z 10
Z 11
Z 11
Y 10
Awk一次隐含地读取输入文件一行。该脚本使用单个变量f
,如果前一行与Z
匹配,则该变量为真(非零)。
f{print; f=0}
如果f
非零,请打印此行并设置f=0
。
/Z/{print; f=1}
如果此行与正则表达式Z
匹配,则打印此行并设置f=1
。
请注意,无需初始化f
。在awk中,未定义的变量默认为零(在数字上下文中)或空字符串(在字符上下文中)。在任何一种情况下,未定义的变量都是逻辑假的。
答案 1 :(得分:0)
也许这也会这样做:
$ sed -n ':check /^Z/ {p; n; h; p; x; b check}' file
- :check
是分支的标签,用于匹配/^Z/
的行(因此,从Z
开始)sed
经历循环:
p
线(=打印匹配的行) n
分机h
旧缓冲区p
rint it (=匹配后打印行) x
更改该行,即将h
旧缓冲区移回(=匹配后返回该行) b
(=检查) ,则check
向^Z
牧场重复整个过程
醇>
原则上,sed
对这种递归应该是好的(sed
不存储任何堆栈,对吧?),但它可能不是。
此外,我不确定脚本是否真的正确:)