sed 不匹配括号内的字符

sed don't match characters inside parenthesis

我正在尝试提出一个 SED 贪婪表达式,它忽略 html 引号内的内容,只匹配该元素的文本。

<p alt="100">100</p> #need to match only second 100
<img src="100.jpg">100</img> #need to match only second 100
<span alt="tel:100">100</span> #need to match only second 100

这些是我的尝试:

grep -E '(!?\")100(!?\")' html # this matches string as well as quotes 
grep -E '[^\"]100[^\"]' html # this doesn't work either

编辑

好的。我试图简化问题,但也许那是错误的。

使用命令 sed -r '/?????/__replaced__/g' file 我需要查看 :

<p alt="100">__replaced__</p>
<img src="100.jpg">__replaced__</img> 
<span alt="tel:100">__replaced__</span> 

第一个警告是 HTML 不是用正则表达式解析的好主意 - 一般来说 - 使用 HTML 解析器是答案。大多数脚本语言(perlpython 等)都有 HTML 个解析器。

有关原因的示例,请参见此处:RegEx match open tags except XHTML self-contained tags

如果你真的必须:

/(?!\>)([^<>]+)(?=\<)/

DEMO

我认为使用 sed(或 grep)处理 HTML 不是一个好主意。考虑使用 python,它的标准库中有一个 HTML push parser。这使得从数据中分离标签变得容易。由于您只想处理标签之间的数据,它可能看起来像这样:

#!/usr/bin/python

from HTMLParser import HTMLParser
from sys import argv

class MyParser(HTMLParser):
    def handle_data(self, data):
        # data is the string between tags. You can do anything you like with it.
        # For a simple example:
        if data == "100":
            print data

# First command line argument is the HTML file to handle.
with open(argv[1], "r") as f:
    MyParser().feed(f.read())

已更新问题的更新: 要使用此编辑 HTML,您必须将 handle_starttaghandle_endtag 方法实现为以及 handle_data 以重新打印已解析标签的方式。例如:

#!/usr/bin/python

from HTMLParser import HTMLParser
from sys import stdout, argv
import re

class MyParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        stdout.write("<" + tag)
        for k, v in attrs:
            stdout.write(' {}="{}"'.format(k, v))
        stdout.write(">")

    def handle_endtag(self, tag):
        stdout.write("</{}>".format(tag))

    def handle_data(self, data):
        data = re.sub("100", "__replaced__", data)
        stdout.write(data)

with open(argv[1], "r") as f:
    MyParser().feed(f.read())

您可以试试下面的 PCRE 正则表达式。

grep -oP '"[^"]*100[^"]*"(*SKIP)(*F)|\b100\b' file

grep -oP '"[^"]*"(*SKIP)(*F)|\b100\b' file

这将匹配双引号内不存在的数字 100。

DEMO

你的问题随着它的演变变得有点混乱,但这是你要的吗?

$ sed -r 's/>[^<]+</>__replaced__</' file
<p alt="100">__replaced__</p> #need to match only second 100
<img src="100.jpg">__replaced__</img> #need to match only second 100
<span alt="tel:100">__replaced__</span> #need to match only second 100

如果不是,请清理您的问题以仅显示最新的样本输入和预期的输出和解释。