我正在尝试使用awk来提取两种模式之间的行,但由于第二种模式涉及多个$$$$
符号,我无法正确保护$
输入是:
Name1
iii
iii
$$$$
Name2
ii
ooo
ppp
$$$$
Name3
pp
oo
ii
uu
$$$$
期望的输出
Name2
ii
ooo
ppp
$$$$
我试过这样的事情:
awk 'BEGIN {RS="\\$\\$\\$\\$\n"; FS="\n"} $1==Name2 {print $0; print "$$$$"}' inputfile
我也试过像
这样的东西awk '/^Name2/,/\\$\\$\\$\\$\\/' input
我尝试了许多不同的$保护,但我做错了,要么没有打印,要么打印整个文件
非常感谢您的建议
答案 0 :(得分:2)
如果您正在寻找文字匹配
,则不必使用模式awk '$0=="Name2",$0=="$$$$"' file
将提取两个文字之间的行。如果第一场比赛是模式,则为组合
awk '/Name2/,$0=="$$$$"' file
答案 1 :(得分:1)
Awk
解决方案:
awk '/^Name2/{ f=1 }f; $1=="$$$$"{ f=0 }' file
f
变量是一个标记,表示打印当前行的可能性输出:
Name2
ii
ooo
ppp
$$$$
答案 2 :(得分:1)
您可以使用双空行,而不是使用$$$$
作为记录分隔符,这意味着分成段落:
awk 'BEGIN{RS=""}/Name2/' file
RS=""
是一个特殊值。从awk
手册页:
如果RS设置为空字符串,则记录由空行分隔。当RS设置为空字符串时,换行符始终作为 除了FS可能具有的任何值之外,还有字段分隔符。
虽然上面的代码适用于您的示例,但在有Name20
等密钥时会遇到麻烦。意味着正则表达式匹配可能不是正确的方法。字符串比较可能是更好的套件:
awk 'BEGIN{RS="";FS="\n"} $1 == "Name2"' file
我明确设置FS="\n"
以避免在单行内拆分。