开发者

Insert double quotes multiple times into string

I have inherited a flat html file with a few hundred lines similar to this:

<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
开发者_运维知识库

So far I have not been able to work out a sed way of inserting the closing double quotes for each element. Probably needs something other than sed to do this. Can anyone suggest an easy way to do this? Thanks


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

Explanation:

  • " - leading double quote
  • \([^" >]\+\) - non-quote-or-space-or-'>' chars, grouped (into group 1)
  • \( \|>\) - terminating space or '>', grouped (into group 2)

We replace it with '"<group1>"<group2>'.


One solution that pops out at me is to parse through each line of the file looking for the quote. When it finds one, activate a flag to keep track of being inside a quoted area, then continue parsing the line until it hits the first space or > it comes to and inserts an additional " just before it. Flip the flag off, then continue through the string looking for the next quote. Probably not a perfect solution, but a start perhaps.


If all lines share the same structure, you could use a simple texteditor to globally replace

' bordercolor'

with

'" bordercolor'

(without single-quotes). This is then independend from the field values and works similarly for the other fields. You still have to do some manual work, but if it's just one big file, I'd bite the bullet this time and not waste probably more time working out a sed-solution.


This should do if your file is simple - it won't work if you have whitespace which should be inside the quotes - in that case, a more complex code will be needed, but can be done along the same lines.

#!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()


with 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


Regular expressions are your friend:

Find: (="[^" >]+)([ >])

Replace: \1"\2

After you've done that, make sure to run this one too:

Find: </?blink>

Replace: \n

(This won't fix more than one class on an element, like <element class="class1 class2 id="jimmy">)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜