在()sed之间打印文本

时间:2011-05-12 03:09:26

标签: printing sed

这是我之前question的扩展。在那个问题中,我需要在括号中检索所有文本都在一行中的文本。现在我有这个案子:

(aop)
(abc
d)

这一次,左括号可以在一行上,而右括号在另一行上,所以:

(abc
d)

也算作分隔符“( )”之间的文字,我需要将其打印为

abc
d

编辑: 针对我的问题可能存在的混淆,请允许我澄清一下。基本上,我需要在可能跨越多行的分隔符之间打印文本。

例如我在我的文件中有这个文字:

randomtext(1234
567) randomtext
randomtext(abc)randomtext

现在我希望Sed在分隔符“(”和“)”之间选择文本。所以输出将是:

1234
567
abc

请注意,左右括号不在同一行,但它们仍被视为1234 567的分隔符,因此我需要打印该部分文本。 (注意,我只想要第一对分隔符之间的文本。)

任何帮助都将不胜感激。

3 个答案:

答案 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代替了括号)