split string逗号分隔为定义的xml strucutre

时间:2018-04-21 15:15:22

标签: bash awk sed

我有一个像这样的输入字符串

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

最多可以有10个关键字 我已将其转换为以下xml结构

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

我的脚本的其余部分是简单的sed / awk命令来替换标签,但没有别的。 有人知道如何将其转换为所需的结构? thx任何建议

更新

我尝试了跟进(来自此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' 

它的工作原理很好,这里是输出:

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

也许它不是最好的方法......但它确实有效。 如果你有更好/更快的解决方案我会很感激...

2更新: 是否有机会仅对/<keywords>/,/<\/keywords>/

之间的文本执行awk / sed命令

3 个答案:

答案 0 :(得分:2)

使用sed和awk:

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

输出:

<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:到目前为止看到的输入记录总数。

答案 1 :(得分:2)

使用awk而不使用sed

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

此方法将现有标记和逗号定义为字段分隔符。一个班轮:

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

答案 2 :(得分: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>