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 解析器是答案。大多数脚本语言(perl
、python
等)都有 HTML 个解析器。
有关原因的示例,请参见此处:RegEx match open tags except XHTML self-contained tags
如果你真的必须:
/(?!\>)([^<>]+)(?=\<)/
我认为使用 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_starttag
和 handle_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。
你的问题随着它的演变变得有点混乱,但这是你要的吗?
$ 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
如果不是,请清理您的问题以仅显示最新的样本输入和预期的输出和解释。
我正在尝试提出一个 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 解析器是答案。大多数脚本语言(perl
、python
等)都有 HTML 个解析器。
有关原因的示例,请参见此处:RegEx match open tags except XHTML self-contained tags
如果你真的必须:
/(?!\>)([^<>]+)(?=\<)/
我认为使用 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_starttag
和 handle_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。
你的问题随着它的演变变得有点混乱,但这是你要的吗?
$ 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
如果不是,请清理您的问题以仅显示最新的样本输入和预期的输出和解释。