【问题标题】:sed awk and grep matching a range between 2 strings of characterssed awk 和 grep 匹配 2 个字符串之间的范围
【发布时间】:2023-01-30 02:46:11
【问题描述】:

我试图在某些 html 标签之间获取内容。我最近一直在提到这个问题How to print lines between two patterns, inclusive or exclusive (in sed, AWK or Perl)?。我已经尝试了这里的两三个建议,以及另一页的另一个建议。我无法让他们中的任何一个工作。

正则表达式 <\s*p(\s+.*?>|>).*?<\s*/\s*p\s*> 在在线 sed 编辑器中工作,但在我的 GNU shell 中不起作用。

写为sed -n '/<p>/,/<\/p>/p' FILE 的模式sed -n '/PAT1/,/PAT2/{/PAT2/!p}' FILE 似乎无声地失败了,因为它只返回文件中的所有内容。

模式 awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' file in my shell as awk '/<p>/{flag=1; next}/<\/p>/{flag=0} flag' file 返回没有匹配项的文件,但它包含还包含(非匹配)文件的其余部分。

【问题讨论】:

  • sed 的/pat1/,/pat2/ 只有在它们是不同的行时才能正常工作。 \s*?| 等不是标准的 sed 语法,但可以在 Perl 中使用。
  • 尝试向您的问题添加一个最小的失败测试用例以及您尝试的代码、实际输出和所需输出。
  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器(xmlstarlet、xmllint ...)。
  • 该正则表达式不可能在任何 sed、在线或其他方式中工作,因为它试图使用 PCRE 构造 (.*?),而 sed 仅支持 BRE 或 ERE。对于某些特定的样本输入,您可能会得到预期的输出,但这并不意味着它有效。
  • edit你的问题用字符串或正则表达式、全部或部分、单词或行替换“模式”,并提供包含简洁、可测试示例输入的minimal reproducible example(确保包括正则表达式元字符和不需要的子字符串匹配)和预期输出,因此我们可以帮助您解决您寻求帮助的任何问题,因为没有针对所有“模式”的通用解决方案,请参阅how-do-i-find-the-text-that-matches-a-pattern 了解详细信息。

标签: bash awk sed


【解决方案1】:

awk '/<p>/{flag=1; next}/</p>/{flag=0} flag' file

此解决方案假定 <p></p> 在自己的行中,因此这将按预期工作,例如

<p>
This is paragraph
</p>
<i>
This is not paragraph
</i>
<p>
This is another paragraph
</p>

但不是

<p>This is paragraph</p><i>This is not paragraph</i><p>This is another paragraph</p>

请注意,使用正则表达式来处理 HTML 通常不是一个好主意,因为 HTML 是 Chomsky Type-2 装置,而 first 是为工作 Chomsky Type-3 装置而设计的。因此我建议使用 hxselect 如果你被允许安装工具那么你可以像这样使用它

hxselect -i -c -s '
' 'p' < file

其中-i 表示不区分大小写,-c 只获取内容(即不包括开始和结束标记),-s ' ' 使用换行符剪切找到的项目,p 是描述要查找的标记的 CSS3 选择器(在这种情况下,所有&lt;p&gt; 标签)。

编辑:如果有绝对地在你的文件中没有换行符并且没有嵌套的p 标签那么你可以尝试使用 GNU AWK 以下方式

awk 'BEGIN{RS="</?p>"}NR%2==0' file

然后希望它能按预期工作。

【讨论】:

  • 我想模式匹配不仅仅是 html 标签。匹配 2 个字符串模式之间的范围对于联网和分析 exif 数据也很有用。如果可以的话,请留在主题上并建议如何在同一行上找到上面的内容。
  • 有趣的理论,但理论本身并不能证明。我宁愿坚持使用 sed,因为它随处可用,而且我正在将其抽象化以将其他类型的 dara 类型作为输入。
  • 支持努力并提及乔姆斯基形式语法。漂亮的兔子洞!
最近更新 更多