操纵sed上下文
这是我的一句话:操纵sed上下文,sed,Sed,这是我的一句话: sed -n '/BEGIN/,/END/{$d;1d;p}' query 和查询: trash BEGIN first labas END nieko nėra BEGIN second iki END nesimato 垃圾 先开始 拉巴斯 结束 nieko nėra 第二个开始 iki 结束 内西马托 我期望这一结果: labas iki 拉巴斯 iki 然而,我明白了: BEGIN first labas END BEGIN second iki END 先开始
sed -n '/BEGIN/,/END/{$d;1d;p}' query
和查询:
trash
BEGIN first
labas
END
nieko nėra
BEGIN second
iki
END
nesimato
垃圾
先开始
拉巴斯
结束
nieko nėra
第二个开始
iki
结束
内西马托
我期望这一结果:
labas
iki
拉巴斯
iki
然而,我明白了:
BEGIN first
labas
END
BEGIN second
iki
END
先开始
拉巴斯
结束
第二个开始
iki
结束
我对sed上下文有什么误解?
{$d,1d;p}
是否应该删除匹配输入的第一行和最后一行?否,它删除匹配输入中作为文件第一行或最后一行的任何一行。如果删除查询的前两行(因此第一行是“开始”),则可以看到效果。这可能适用于您:
sed -n '/BEGIN/,/END/{//!p}' file
labas
iki
是的,它确实有效,但无助于解释为什么我的版本不起作用。。谢谢你能告诉我为什么吗?这两个斜杠对这些大括号中的上下文到底有什么作用?您的版本将工作,但仅当范围/BEGIN/,/END/
在文件的第一行和最后一行之间时。/
是最后一个匹配regexp的简写,在本例中是/BEGIN/
,后面是/END/
。在这些条件下,它不会打印出来,但在它之间的行上会打印出来。