Bash和Regular Expressions删除xml文件中的标记

时间:2012-01-06 21:03:30

标签: xml regex bash unix

我需要解决一个让我整天都在努力解决问题的问题。

我有以下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 个答案:

答案 0 :(得分:1)

如果您想删除<p></p>中的<TXT_accesp></ TXT_accesp>标签,那么您可以使用类似的内容 -

sed '/\<TXT_accesp\>/,/\<\/TXT_accesp\>/s@</\?p>@@g' INPUT_FILE

答案 1 :(得分:1)

我通常使用xsh2进行XML处理。但它需要格式良好的XML,因此我必须将您的数据包装到<root> ... </root>中。然后,我刚刚运行了xsh2:

open file.xml ;
for //TXT_accesp/p xmove (*|text()) replace . ;
save :b ;

答案 2 :(得分:0)

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