这是我之前question的扩展。在那个问题中,我需要在括号中检索所有文本都在一行中的文本。现在我有这个案子:
(aop)
(abc
d)
这一次,左括号可以在一行上,而右括号在另一行上,所以:
(abc
d)
也算作分隔符“( )
”之间的文字,我需要将其打印为
abc
d
编辑: 针对我的问题可能存在的混淆,请允许我澄清一下。基本上,我需要在可能跨越多行的分隔符之间打印文本。
例如我在我的文件中有这个文字:
randomtext(1234
567) randomtext
randomtext(abc)randomtext
现在我希望Sed在分隔符“(”和“)”之间选择文本。所以输出将是:
1234
567
abc
请注意,左右括号不在同一行,但它们仍被视为1234 567的分隔符,因此我需要打印该部分文本。 (注意,我只想要第一对分隔符之间的文本。)
任何帮助都将不胜感激。
答案 0 :(得分:3)
啊!另一个棘手的sed难题:)
我相信此代码适用于您的问题:
sed -n '/(/,/)/{:a; $!N; /)/!{$!ba}; s/.*(\([^)]*\)).*/\1/p}' file
对于提供的输入:
1234
567
abc
<强>解释强>
-n
会抑制常规sed输出/(/,/)/
适用于(
和)
:a
用于标记标签$!N
表示将下一行输入附加到当前模式空间/)/!
表示如果)
在当前模式空间中不匹配,请执行某些操作/)/!${!ba}
表示如果a
在当前模式空间中不匹配,请转到)
标签s/.*(\([^)]*\)).*/\1/
表示仅将内容替换为(
和)
之间的内容,从而删除括号\1
用于第1组的反向引用,即\(
和\)
之间的文字p
用于打印替换内容答案 1 :(得分:0)
This link有答案。我是在解释你的需要:
sed -n '1h;1!H;${;g;s/.*(\([^)]*\)).*/\1/;p}' < your_input
答案 2 :(得分:0)
给出的答案不适用于我的情况。对我有用的是:
cat file | tr -d '\n'
^^^ 这样可以通过删除换行符将整个文件放在一行中。
,然后我将其进一步传送到答案here中。 (注意:在该问题中,使用OPEN和CLOSE代替了括号)