1

i have an input string like this

<keywords>key word 1, key word 2, key word 3, key word 4, key word 5, key word 6, ..  </keywords>

there could be up to 10 keywords i have tor transform this to the following xml structure

<keyword1>key word 1</keyword1>
<keyword2>key word 2</keyword2>
<keyword3>key word 3</keyword3>
<keyword4>key word 4</keyword4>
<keyword5>key word 5</keyword5>
<keyword6>key word 6</keyword6>
<keyword7>...</keyword7>

the rest of my script are simple sed / awk commands to replace tags but nothing else. have someone an idea how i could convert it to the desired structure? thx for any advice

Update:

i tried the followoing (from this post )

echo "<keywords>key word 1, key word 2, key word 3, key word 4, key word 5 </keywords>" | awk '{split($0,a,","); print "<keyword1>"a[1]"</keyword1>\n<keyword2>"a[2]"</keyword2>\n<keyword3>"a[3]"</keyword3>\n<keyword4>"a[4]"</keyword4>\n<keyword5>"a[5]"</keyword5>\n<keyword6>"a[6]"</keyword6>\n<keyword7>"a[7]"</keyword7>\n<keyword8>"a[8]"</keyword8>\n<keyword9>"a[9]"</keyword9>\n<keyword10>"a[10]"</keyword10>\n"}' | sed -e 's/<keywords>//g' |sed -e 's/<\/keywords>//g' 

it works quide good, here the output:

<keyword1>key word 1</keyword1>
<keyword2> key word 2</keyword2>
<keyword3> key word 3</keyword3>
<keyword4> key word 4</keyword4>
<keyword5> key word 5 </keyword5>
<keyword6></keyword6>
<keyword7></keyword7>
<keyword8></keyword8>
<keyword9></keyword9>
<keyword10></keyword10>

maybe it's not the best method... but it works. if you have better / faster solution I would appreciate it…

2 Update: is there a chance to execute the awk / sed command only for the text between /<keywords>/,/<\/keywords>/

Roland
  • 113
  • 2
  • 11

3 Answers3

2

With sed and awk:

sed 's|</*keywords>||g; s/, /\n/g' | awk '{print "<keyword" NR ">" $0 "</keyword" NR ">"}'

Output:

<keyword1>key word 1</keyword1>
<keyword2>key word 2</keyword2>
<keyword3>key word 3</keyword3>
<keyword4>key word 4</keyword4>
<keyword5>key word 5</keyword5>
<keyword6>key word 6</keyword6>
<keyword7>..  </keyword7>

NR: The total number of input records seen so far.

Cyrus
  • 84,225
  • 14
  • 89
  • 153
2

Using awk without working with sed:

awk -F " *<[^<>]+> *|, *" '{
    r = "";
    for(i=1; i<=NF; i++) {
        if ($i) r = r "<keyword" ++j ">" $i "</keyword" j ">" RS
    }
    print r;
}' file

This approach defines existing tags and commas as field separators. One liner:

echo ... | awk -F " *<[^<>]+> *|, *" '{ r = ""; for(i=1; i<=NF; i++) { if ($i) r = r "<keyword" ++j ">" $i "</keyword" j ">" RS } print r;}'
revo
  • 47,783
  • 14
  • 74
  • 117
1
awk -F' *, *' '
    gsub(/<\/?keywords>/,"") {
        for (i=1; i<=NF; i++) {
            print "<keyword"i">" $i "</keyword"i">"
        }
    }
' file
<keyword1>key word 1</keyword1>
<keyword2>key word 2</keyword2>
<keyword3>key word 3</keyword3>
<keyword4>key word 4</keyword4>
<keyword5>key word 5</keyword5>
<keyword6>key word 6</keyword6>
<keyword7>..  </keyword7>
Ed Morton
  • 188,023
  • 17
  • 78
  • 185