我继承了一个平坦的HTML文件有几百行与此类似:插入双引号多次到字符串
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
到目前为止,我一直没能制定出将封闭的SED方式每个元素的双引号。可能需要sed之外的东西来做到这一点。任何人都可以提出一个简单的方法来做到这一点? 感谢
我继承了一个平坦的HTML文件有几百行与此类似:插入双引号多次到字符串
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
到目前为止,我一直没能制定出将封闭的SED方式每个元素的双引号。可能需要sed之外的东西来做到这一点。任何人都可以提出一个简单的方法来做到这一点? 感谢
一个解决方案,弹出我是通过寻找报价文件的每一行进行解析。当它发现一个,启动一个标志,以保持的是一个带引号的区域内的轨道,然后继续解析线,直到它遇到第一个空间或>谈到,只是前插入一个额外的“翻转标志关闭,然后继续通过串寻找下一个报价。也许不是一个完美的解决方案,而是一个开始也许。
如果所有线路共享相同的结构,你可以使用一个简单的文本编辑在全球范围内与
取代' bordercolor'
'" bordercolor'
(不含单引号)。然后这是从字段值独立出来的,并且对于其他字段的作用类似。你仍然需要做一些手工的工作,但如果它只是一个大文件,我硬着头皮这段时间,不要浪费可能更多的时间工作了一个sed的解决方案。
这应该做的,如果你的文件很简单 - 如果你有空白这应该是引号内它不会工作 - 在这种情况下,将需要更复杂的代码,但可以沿着相同的路线来完成。
#!usr/bin/env python
#change the "utf-8" bellow to your files encoding
data = open("<myfile.html>").read().decode("utf-8")
new_data = []
inside_tag = False
inside_quotes = False
for char in data:
if char == "<":
inside_tag = True
if char == '"':
inside_quotes = True
if inside_tag and (char.isspace() or char==">") and inside_quotes:
new_data.append('"')
inside_quotes = False
if char == ">":
inside_tag = False
new_data.append(char)
outputfile = open("<mynewfile.html>", "wt")
outputfile.write("".join(new_data).encode("utf-8"))
outputfile.close()
sed -i 's/"\([^" >]\+\)\(\|>\)/"\1"\2/g' file.html
说明:
"
- 领先双引号\([^" >]\+\)
- 非引号或空间 - 或 - '>
' 字符,分组(成组1)\(\|>\)
- 终止空间或 '>
',分组(成组2)我们与 '"<group1>"<group2>
' 代替它。
正则表达式是您的朋友:
查找:(="[^" >]+)([ >])
替换:\1"\2
后你这样做,一定要运行这一个了:
寻找:</?blink>
替换:\n
(这不会解决一个元素多个类,如<element class="class1 class2 id="jimmy">
)
为什么'([|>])'而不是'([>])或'(|>>)'? – dubiousjim 2010-02-23 11:04:29
我想我是被超显式的。 – Seth 2010-02-23 17:11:26
使用bash
for file in *
do
flag=0
while read -r line
do
case "$line" in
*"<blink>"*)
flag=1
;;
esac
if [ "$flag" -eq 1 ];then
case "$line" in
*class=\"pagetxt*">")
line="${line%>}\">"
flag=0
;;
esac
fi
echo "${line}"
done <"file" > temp
mv temp "$file"
done
是 - 我知道这是可以实现通过大多数语言中的“简单”正则表达式 - per,sed,python等......但是这种正则表达式的逻辑无关于上面代码片段完全表达的逻辑。正因为正则表达式会更短,这并不意味着它会更简单。 – jsbueno 2009-12-10 16:41:20
杰出的jsbueno是一种魅力 - 非常感谢:) – 2009-12-10 16:46:08