使用sed在分隔符之间进行打印

时间:2011-05-16 21:22:53

标签: printing sed

这是我之前回答者推荐的question的延伸。基本上,我需要sed在分隔符之间打印文本。分隔符可以跨越多行,如:

(abc
d)

以下是示例输入和输出。

输入

(123) 
aa (a(b)cd)) (g) (c)fff 
abcd(aabb 
d)aa (aeb)oe

正确输出

123
a(b  
aabb
d

注意:我只想要第一对分隔符之间的文本。如果分隔符跨越两行而不是我只想要跨越两行的第一对之间的文本并移动到第三行(下一行)。因此,对于输入中的最后一行,我打印'd'并跳过(aeb)并继续前进到下一行。

1 个答案:

答案 0 :(得分:2)

我使用了一个sed脚本文件(名为sedscript),其中包含:

/^[^(]*([^)]*$/N
s/^[^(]*(\([^)]*\)).*/\1/p

和命令行:

sed -n -f sedscript data

鉴于输入:

(123)
aa (a(b)cd)) (g) (c)fff
abcd(aabb
d)aa (aeb)oe

它产生了输出:

123
a(b
aabb
d

您可以在单个命令行上执行以下操作:

sed -n -e '/^[^(]*([^)]*$/N' -e 's/^[^(]*(\([^)]*\)).*/\1/p' data

第一个模式在其后面查找包含一个没有右括号的左括号的行,并将下一行读入内存并重新开始。它会重复,直到数据(或EOF)中有一个紧密的括号。第二个模式在开括号之前查找东西,开括号,从那里记住数据到第一个右括号,然后是紧密括号和任何其他东西;它用记住的字符串替换它并打印它。不打印任何其他内容(-n)。