【问题标题】:Print text between ( ) sed在 ( ) sed 之间打印文本
【发布时间】:2019-08-05 06:35:33
【问题描述】:

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

(aop)
(abc
d)

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

(abc
d)

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

abc
d

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

例如,我的文件中有以下文本:

randomtext(1234
567) randomtext
randomtext(abc)randomtext

现在我想让 Sed 挑选出分隔符“(”和“)”之间的文本。所以输出将是:

1234
567
abc

请注意,左右括号不在同一行,但它们仍然算作 1234 567 的分隔符,所以我需要打印这部分文本。 (注意,我只想要第一对分隔符之间的文本)。

任何帮助将不胜感激。

【问题讨论】:

  • 我很难理解你的问题。
  • @Rahul 基本上我需要使用 Sed 进行多行打印以打印分隔符之间的文本。
  • 为了更清楚,我已经编辑了这个问题。
  • @Jonathan 感谢您的编辑!编辑:另外,你是如何让文本出现在灰色背景上的?
  • NP - 虽然我知道我应该将 'for example' 更改为 'For example'...通过输入并选择它,然后按文本编辑框上方的“{}”图标;缩进四个空格,表示代码,并使用等宽字体和灰色背景。它还会停止文本换行。还有一个链接按钮 - 您突出显示文本(例如“问题”)并单击;然后您可以输入(或者,更常见的是粘贴)网址。

标签: printing sed


【解决方案1】:

啊!另一个棘手的 sed 难题:)

我相信这段代码可以解决你的问题:

sed -n '/(/,/)/{:a; $!N; /)/!{$!ba}; s/.*(\([^)]*\)).*/\1/p}' file

输出

对于它产生的提供的输入:

1234
567
abc

说明:

  • -n 抑制常规 sed 输出
  • /(/,/)/ 用于在 () 之间选择范围
  • :a 用于标记标签a
  • $!N 表示将下一行输入追加到当前模式空间中
  • /)/! 表示如果 ) 在当前模式空间中不匹配,则执行一些操作
  • /)/!${!ba} 表示如果 ) 在当前模式空间中不匹配,则转到标签 a
  • s/.*(\([^)]*\)).*/\1/ 表示仅将 () 之间的内容替换为内容,从而去掉括号
  • \1 用于第 1 组的反向引用,即 \(\) 之间的文本
  • p 用于打印替换的内容

【讨论】:

  • 我在你的 sed 掌握面前鞠躬。你的 sed-fu 很强大!
  • @anubhava 感谢您的出色回答和解释!但是,我无法在 slackware 13.37 上运行它。输出为: sed: -e expression #1, char 22: unknown command: `$'
  • @mark:你能试试这个吗:sed -n '/(/,/)/{$!N; /)/!{$!N;}; s/.*(\([^)]*\)).*/\1/p;}' file我无法访问 slackware,但在 Mac 和 Linux 上测试过。
  • @anubhava 我再次尝试了这两个代码,但我得到 N: event not found。会不会是我使用了不同的 SED 标准? (注意我在 slackware 和 ubuntu 上都试过了。)
  • 如果是当前版本的 Ubuntu,在 Ubuntu 上应该没问题。事实上,我在自己的 Ubuntu 上构建了上述命令 :)
【解决方案2】:

This link 有答案。我正在解释以满足您的需要:

sed -n '1h;1!H;${;g;s/.*(\([^)]*\)).*/\1/;p}' < your_input

【讨论】:

  • 它似乎工作,但它只输出最后一对分隔符的文本。关于如何调整它的任何想法?
【解决方案3】:

给出的答案不适用于我的情况。对我有用的是:

cat file | tr -d '\n'

^^^ 这通过删除换行符将整个文件放在一行中。

然后我进一步将其输入答案here。 (注意:该问题使用 OPEN 和 CLOSE 代替括号)

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2015-05-04
    相关资源
    最近更新 更多