1

我继承了一个包含几百行的平面 html 文件,类似于:

<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>

到目前为止,我还没有找到一种 sed 方法来为每个元素插入右双引号。可能需要除 sed 之外的其他东西来执行此操作。谁能建议一个简单的方法来做到这一点?谢谢

4

6 回答 6

1
sed -i 's/"\([^" >]\+\)\( \|>\)/"\1"\2/g' file.html

解释:

  • "- 前导双引号
  • \([^" >]\+\)- 非引号或空格或 - ' >' 字符,分组(到组 1)
  • \( \|>\)- 终止空格或 ' >',分组(进入第 2 组)

我们用' "<group1>"<group2>'代替它。

于 2009-12-10T17:06:11.800 回答
0

我突然想到的一个解决方案是解析文件的每一行以查找报价。当它找到一个时,激活一个标志以跟踪是否在引用区域内,然后继续解析该行直到它碰到第一个空格或 > 它到达并在它之前插入一个额外的 "。关闭标志,然后继续通过字符串寻找下一个引号。可能不是一个完美的解决方案,但也许是一个开始。

于 2009-12-10T16:27:21.527 回答
0

如果所有行共享相同的结构,您可以使用简单的文本编辑器来全局替换

' bordercolor'

'" bordercolor'

(没有单引号)。然后,这与字段值无关,并且对其他字段的工作方式类似。你仍然需要做一些手工工作,但如果它只是一个大文件,我这次会咬紧牙关,不会浪费更多时间来制定 sed 解决方案。

于 2009-12-10T16:29:02.320 回答
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
于 2009-12-11T00:09:55.237 回答
0

正则表达式是你的朋友:

寻找: (="[^" >]+)([ >])

代替: \1"\2

完成之后,确保也运行这个:

寻找: </?blink>

代替: \n

(这不会在一个元素上修复多个类,例如<element class="class1 class2 id="jimmy">

于 2009-12-10T17:31:47.593 回答
0

如果您的文件很简单,则应该这样做-如果引号内应包含空格,则它将不起作用-在这种情况下,将需要更复杂的代码,但可以按照相同的方式完成。

#!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()
于 2009-12-10T16:34:40.650 回答