我继承了一个包含几百行的平面 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 之外的其他东西来执行此操作。谁能建议一个简单的方法来做到这一点?谢谢
sed -i 's/"\([^" >]\+\)\( \|>\)/"\1"\2/g' file.html
解释:
"
- 前导双引号\([^" >]\+\)
- 非引号或空格或 - ' >
' 字符,分组(到组 1)\( \|>\)
- 终止空格或 ' >
',分组(进入第 2 组)我们用' "<group1>"<group2>
'代替它。
我突然想到的一个解决方案是解析文件的每一行以查找报价。当它找到一个时,激活一个标志以跟踪是否在引用区域内,然后继续解析该行直到它碰到第一个空格或 > 它到达并在它之前插入一个额外的 "。关闭标志,然后继续通过字符串寻找下一个引号。可能不是一个完美的解决方案,但也许是一个开始。
如果所有行共享相同的结构,您可以使用简单的文本编辑器来全局替换
' bordercolor'
和
'" bordercolor'
(没有单引号)。然后,这与字段值无关,并且对其他字段的工作方式类似。你仍然需要做一些手工工作,但如果它只是一个大文件,我这次会咬紧牙关,不会浪费更多时间来制定 sed 解决方案。
用 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
正则表达式是你的朋友:
寻找: (="[^" >]+)([ >])
代替: \1"\2
完成之后,确保也运行这个:
寻找: </?blink>
代替: \n
(这不会在一个元素上修复多个类,例如<element class="class1 class2 id="jimmy">
)
如果您的文件很简单,则应该这样做-如果引号内应包含空格,则它将不起作用-在这种情况下,将需要更复杂的代码,但可以按照相同的方式完成。
#!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()