我有一个像这样的输入字符串
<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>/
答案 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>