我继承了一个平坦的html文件,其中有几百行,类似于:
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
到目前为止,我还没有能够找到为每个元素插入结束双引号的sed方法。可能需要除了sed之外的其他东西。谁能建议一个简单的方法来做到这一点? 感谢
答案 0 :(得分:1)
sed -i 's/"\([^" >]\+\)\( \|>\)/"\1"\2/g' file.html
说明:
"
- 领先双引号\([^" >]\+\)
- 非引用或空格或 - “>
”字符,分组(到第1组)\( \|>\)
- 终止空格或“>
”,分组(进入第2组)我们将其替换为“"<group1>"<group2>
”。
答案 1 :(得分:0)
在我身上弹出的一个解决方案是解析文件的每一行以查找引用。当它找到一个时,激活一个标记以跟踪在引用区域内,然后继续解析该行直到它到达第一个空格或>它来到并插入一个额外的“就在它之前。翻转旗帜,然后继续通过字符串寻找下一个引用。可能不是一个完美的解决方案,但也许是一个开始。
答案 2 :(得分:0)
如果所有行共享相同的结构,您可以使用简单的texteditor全局替换
' bordercolor'
与
'" bordercolor'
(没有单引号)。然后,它独立于字段值,并且对于其他字段的工作方式类似。你仍然需要做一些手工工作,但如果它只是一个大文件,这次我会咬紧牙关,不要浪费更多的时间来制定一个sed解决方案。
答案 3 :(得分:0)
如果您的文件很简单,这应该可以做 - 如果您的空格应该在引号内,它将无法工作 - 在这种情况下,将需要更复杂的代码,但可以沿着相同的行完成。 / p>
#!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()
答案 4 :(得分:0)
正则表达式是你的朋友:
查找: (="[^" >]+)([ >])
替换: \1"\2
完成后,请确保也运行这个:
查找: </?blink>
替换: \n
(这不会修复元素上的多个类,如<element class="class1 class2 id="jimmy">
)
答案 5 :(得分:0)
使用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