【问题标题】:Sed Extract between two patterns first matching两个模式之间的 Sed 提取首先匹配
【发布时间】:2017-12-08 16:05:56
【问题描述】:

(Xubuntu 16.04.2 x86_64) 我正在尝试解析一个 html 文件并从中获取值。我需要在这之间提取的所有代码

<tr style="text-align: center; background:#FFF">

还有这个

</td></tr>

问题是我通过一个循环运行它来抓取这些部分中的 800 个,但它第一次运行时它正确地找到了第一个字符串,但它使用文件中的最后一个匹配项而不是第一个匹配项中的下一个细绳。

我将每个 find 输出到一个文本文件中,第一个将每个条目组合在一起,这不是我需要的,我需要每个条目的单独文件。

假设我有这个 html,而不是使用那个复杂的字符串

<div>
  Index
  Index
  Index
</div>
<div>
  Index
  Index
  Index
</div>
<div>
  Index
  Index
  Index
</div>

我正在使用此代码

sed 1,/<div>/,/<\/div>/!d' sourcefile > output

但是该命令给出了整个文件而不是选择&lt;/div&gt;.的第一个匹配项

如果可能的话,我宁愿使用 sed 而不是 awk、grep 或 perl。

【问题讨论】:

  • 通过循环抓取这些部分中的 800 个 - 我需要为每个条目单独的文件 - 所以你想获得 800 个文件?跨度>
  • 是的,但我可以编码那部分,暂时无关紧要。
  • 使用 Python 很容易

标签: string design-patterns sed find between


【解决方案1】:

如果您坚持使用sed,这应该可以解决问题(如果我正确理解您的问题):

sed -n '/<div>/,/<\/div>/ { /<\/*div>/d; p }' file

由于 POSIX ERE(扩展正则表达式)总是贪婪,地址范围 /&lt;div&gt;/,/&lt;\/div&gt;/ 将始终捕获连续的 divs。我们在这些块上运行的命令只是删除(外部)&lt;div&gt;&lt;/div&gt;;打印出其他所有内容。

对于输入file

a
<div>
    1
</div>
b
<div>
    2
</div>
c
<div>
    3
</div>
d

输出是:

    1
    2
    3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2019-02-25
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多