Разделенная строка запятая, разделенная на определенную структуру xml

Roland спросил: 28 марта 2018 в 01:35 в: bash

У меня есть входная строка, такая как

<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 для любого совета

Обновление:

Я попробовал следующее (из этого сообщение )

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' 

он работает quide good, вот вывод:

<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 Обновление: есть возможность выполнить команду awk / sed только для текста между /<keywords>/,/<\/keywords>/


3 ответа

Есть решение
Cyrus ответил: 28 марта 2018 в 02:12

С помощью 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: Общее количество входных записей, просмотренных на данный момент.

revo ответил: 28 марта 2018 в 02:31

Использование 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;}'
Ed Morton ответил: 29 марта 2018 в 11:05
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>