views:

309

answers:

6

Hi Folks 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

A: 

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.

BBlake
A: 

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.

Kosi2801
A: 

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()
jsbueno
Yes - I know this could be achieved by a "simple" regular expression in most languages - per, sed, python, etc... however the logic inerent to such regexp is the one expressed in full by the above snippet. Just because a regexp would be shorter, that does not mean it would be simpler.
jsbueno
Outstanding jsbueno works a charm - many thanks for this :)
Steve Crowder
+1  A: 
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>'.

orip
A: 

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">)

Seth
Why `([ |>])` instead of just `([ >])` or `( |>)`?
profjim
I guess I was being extra-explicit.
Seth
A: 

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