Bash и регулярные выражения для удаления тегов в XML-файле - PullRequest
0 голосов
/ 07 января 2012

Мне нужно решить вопрос, который заставлял меня целый день пытаться его решить.

У меня есть следующий XML-файл:

<p> </p>
<p> </p>
<p class="subtit">Transporte:</p>
<p>Para transporte desde y hacia el Aeropuerto Internacional Arturo Merino Benítez (fono 56-2-690 19 00) existen diversas empresas que prestan este servicio: buses, minibuses y taxis. Se recomienda contratar transporte autorizado dentro del aeropuerto.</p>

<TXT_accesp>
<p>Climate:</p>
<p>Santiago has a temperate Mediterranean climate with an annual average temperature of 14.5º Celsius. September is the start of spring, the climate is gentle and fresh with highs reaching 28 degrees during the day that drop to 6º C (43º F) to 12º C (54º F) at night.</p>
<p> </p>
<p>Language:</p>
<p>Spanish</p>
<p> </p>
</TXT_accesp>

<p> </p>
<p> </p>
<p class="subtit">Transporte:</p>
<p>Para transporte desde y hacia el Aeropuerto Internacional Arturo Merino Benítez (fono 56-2-690 19 00) existen diversas empresas que prestan este servicio: buses, minibuses y taxis. Se recomienda contratar transporte autorizado dentro del aeropuerto.</p>

Затем я удаляю все теги <p> </ p>, не удаляя текст внутри, но только те <p> </ p> найденные внутри тега <TXT_accesp> and </ TXT_accesp>

Я делаю это с помощью bash, поскольку многие файлы будут там, где мне нужно заменить эти теги. Пока что я сделал следующее:

sed -e 's/<TXT_accesp><p>\(.*\)<\/p><\/TXT_accesp>$/\1/g' example.xml

Идея состоит в том, чтобы удалить весь текст <p> </ p> или независимый текст, если они не находятся внутри, но если текст не удален. После этого идея заключается в том, чтобы сохранить изменения.

Вы можете мне помочь?

Жажда не в том, указана ли команда или я комбинирую ее с другой. Кроме того, регулярные выражения не знают, правильно ли это.

Большое спасибо всем!

Ответы [ 3 ]

1 голос
/ 07 января 2012

Если вы хотите удалить теги <p> и </p> внутри <TXT_accesp> и </ TXT_accesp>, тогда вы можете использовать что-то вроде этого -

sed '/\<TXT_accesp\>/,/\<\/TXT_accesp\>/s@</\?p>@@g' INPUT_FILE
1 голос
/ 07 января 2012

Я обычно использую xsh2 для обработки XML. Однако для этого требуется правильно сформированный XML, поэтому мне пришлось заключить ваши данные в <root> ... </root>. Затем я просто запустил xsh2:

open file.xml ;
for //TXT_accesp/p xmove (*|text()) replace . ;
save :b ;
0 голосов
/ 07 января 2012
is_inside=false
while read -r line; do
        if [[ "$line" =~ "<TXT_accesp>" ]]; then
                is_inside=true
        elif [[ "$line" =~ "</TXT_accesp>" ]]; then
                is_inside=false
        fi 
        if [ $is_inside = true ]; then
                echo $line | sed -e 's/<p>\(.*\)<\/p>$/\1/g'
        else
                echo $line
        fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...