在字符串中多次插入双引号

时间:2009-12-10 16:21:08

标签: sed double-quotes

我继承了一个平坦的html文件,其中有几百行,类似于:

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

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

6 个答案:

答案 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