Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printing 使用sed在分隔符之间打印_Printing_Sed - Fatal编程技术网

Printing 使用sed在分隔符之间打印

Printing 使用sed在分隔符之间打印,printing,sed,Printing,Sed,这是我之前由回答者推荐的内容的扩展。基本上,我需要sed在分隔符之间打印文本。分隔符可以跨越多行,如: (abc d) 下面是示例输入和输出 输入 正确输出 123 a(b aabb d 注意:我只需要第一对分隔符之间的文本。如果分隔符跨越两行,我只希望第一对之间的文本跨越两行,然后移到第三行(下一行)。因此,对于输入中的最后一行,我打印了“d”并跳过(aeb),然后移到下一行。我使用了一个sed脚本文件(称为sedscript),其中包含: /^[^(]*([^)]*$/N s/^[^

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

(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