gpt4 book ai didi

python - 如何删除或替换两个 xml 标记之间的特定字符 [linux、python、lxml、sed、awk、...]?

转载 作者:数据小太阳 更新时间:2023-10-29 02:33:22 27 4
gpt4 key购买 nike

我在 python 中使用 LXML 库进行 XML 解析。

在 XML 文件中,我有一些错误字符导致 python 出现以下错误:

lxml.etree.XMLSyntaxError: CharRef

在用 python 打开和获取 XML 文件的内容之前,我必须从两个标签中删除坏字符:

1:<essid cloaked="true">....</essid><essid cloaked="false">....</essid> .

2:<client-manuf>....</client-manuf>

XML 文件的大小很大。所以我想用 sed 或 awk 或类似的工具来完成。

    <crypt>0</crypt>
<total>20 50</total>
<fragments>0</fragments>
<retries>0</retries>
</packets>
<datasize>0</datasize>
<wireless-client number="1" type="established" first-time="Thu Feb 15 16:45:43 2018" last-time="Thu Feb 15 16:45:43 2018">
<client-mac>08:EA:40:D0:55:43</client-mac>
<client-manuf>SHENZHEN BILIAN ELECTRONIC CO.&#x ef;&#x bc;&#x 8c;LTD</client-manuf>
<essid cloaked="true">&#x 0;&#x 0;&#x 0;&#x 0;&#x 0;</essid>
<channel>8</channel>
<maxseenrate>1.000000</maxseenrate>
<carrier>IEEE 802.11b+</carrier>
<encoding>CCK</encoding>
<packets>
<LLC>0</LLC>
<data>0</data>
<crypt>0</crypt>

我想从这些标签(client-manuf 和 essid)中删除坏字符。

发件人:<client-manuf>SHENZHEN BILIAN ELECTRONIC CO.&#x ef;&#x bc;&#x 8c;LTD</client-manuf>

至(或此):<client-manuf>SHENZHEN BILIAN ELECTRONIC CO. LTD</client-manuf>

至(或此):<client-manuf>SHENZHEN BILIAN ELECTRONIC CO</client-manuf>

--------------------------------------------

发件人:<essid cloaked="true">&#x 0;&#x 0;&#x 0;&#x 0;&#x 0;</essid>

发件人:<essid cloaked="false">&#x 0;&#x WiFi 0;&#x MTN 0;&#x 0;&#x 0;</essid>

至(或此):<essid cloaked="true"></essid>

至(或此):<essid cloaked="true">N/A SSID</essid>

至(或此):<essid cloaked="false">WiFi MTN</essid>

for example, two bad chars:

1: 0;

2: &#x

这是我的解决方案。但它不能很好地满足我的需求:

sed -e '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/ s/\(&#x\|0;\)//g' a.txt

最佳答案

您的 sed 命令看起来并没有那么糟糕,它只是留下了很多空白。

由于 sed 通常是贪婪的,您可以用“*”指定任意数量的空间。

cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/ s/ *\(&#x\|0;\) *//g'

另一方面,如果有一些有效的文本,您可能不想将它们粘在一起,因此您可以为每个删除的模式添加一个空格:

cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/ s/ *\(&#x\|0;\) */ /g'

最后,您可能会将多个空格压缩为一个:

cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/{s/ *\(&#x\|0;\) */ /g;s/  */ /g}'

请注意,构造 {foo;bar} 将两个命令绑定(bind)到一个命令 block ,仅在之前抓取的模式上运行。第二种模式会影响整个文件。

用另一对带掩码的括号和带掩码的加号:

cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/{s/\( *\(&#x\|0;\) *\)\+/ missing essid /g;s/  */ /g}'

你可以 s:substitution 重复出现的模式只用一件事。

      s/\( *\(&#x\|0;\) *\)\+/ missing essid /;
^ ( (pattern1) )+ / replacement /(g now obsolete
(pattern .......2)

内部模式是替代的 &#x 或 0;。外部模式是内部模式,可选地由空白保护,如

     "0;"
"0; "
" 0; "
" 0;"
" 0; "
" &#x"

等等。

你想要内部模式,我们称它为 X,重复一次或多次,因此 +。但是如果没有括号,+ 只会处理最后一个字符,而不是整个模式。

您必须学习这种正则表达式语言。找一个教程。你不能要求你生活中需要的每一种可能的变化。

拥有良好的基本理解会很快带来返回。你不需要知道一切,但基本的东西应该有一个很好的估计,什么是可能的,什么不是。然后一个repo,去搜索那些很少用到的东西。然后您可能只会问困难/复杂的问题。

关于python - 如何删除或替换两个 xml 标记之间的特定字符 [linux、python、lxml、sed、awk、...]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48826469/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com