Printing 使用sed在分隔符之间打印
这是我之前由回答者推荐的内容的扩展。基本上,我需要sed在分隔符之间打印文本。分隔符可以跨越多行,如:Printing 使用sed在分隔符之间打印,printing,sed,Printing,Sed,这是我之前由回答者推荐的内容的扩展。基本上,我需要sed在分隔符之间打印文本。分隔符可以跨越多行,如: (abc d) 下面是示例输入和输出 输入 正确输出 123 a(b aabb d 注意:我只需要第一对分隔符之间的文本。如果分隔符跨越两行,我只希望第一对之间的文本跨越两行,然后移到第三行(下一行)。因此,对于输入中的最后一行,我打印了“d”并跳过(aeb),然后移到下一行。我使用了一个sed脚本文件(称为sedscript),其中包含: /^[^(]*([^)]*$/N s/^[^
(abc
d)
下面是示例输入和输出
输入
正确输出
123
a(b
aabb
d
注意:我只需要第一对分隔符之间的文本。如果分隔符跨越两行,我只希望第一对之间的文本跨越两行,然后移到第三行(下一行)。因此,对于输入中的最后一行,我打印了“d”并跳过(aeb),然后移到下一行。我使用了一个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
)。感谢Mark发布此内容。现在我不明白的是,为什么(a(b)cd)
变成a(b
,为什么不分别为(g)
和(c)
显示g
和c
。我添加了进一步的注释来澄清问题。基本上,我想要第一对定界符之间的文本(在每一行上,或者如果它跨越多行,我将选择这一对并在它们之间打印文本)。感谢您的澄清,但在我看来,这些嵌套的(
和)
将使正则表达式很难捕获。在阅读您上一个问题的答案之前,我曾建议切换到awk来完成这项工作,但现在我不再确定了。:-)嗯……我不明白您心目中的情况,您是否愿意详细说明?例如,如果它只是((a)()那么=>((a)对吗?谢谢Jonathan!我已经测试了很多案例,我很确定它最终解决了问题。也感谢anubhava的大力帮助。
sed -n -e '/^[^(]*([^)]*$/N' -e 's/^[^(]*(\([^)]*\)).*/\1/p' data