【发布时间】: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 了解详细信息。