【问题标题】:Move text around on xml using sed使用 sed 在 xml 上移动文本
【发布时间】:2012-09-15 12:31:18
【问题描述】:

编辑:无论如何感谢您的帮助,忘记它..我将使用java直接在我的服务器上解析xml,然后直接从服务器将其下载到我的设备......这样更容易和更快.. .

有人可以帮助我使用 sed 命令吗?我不太擅长那个:)

我删除了<title lang="en"> 行,只保留了“pt”行..(设备限制)
我已经这样做了,并且工作正常,如下所示:

sed -i '/<title lang=\"en\">/d' xmltv_clarotv.xml 

现在,我正在尝试执行我所说的代码,并从&lt;date&gt;&lt;/date&gt; 获取内容并将其放在&lt;title lang="pt"&gt; 中,这应该会产生如下结果:
&lt;title lang="pt"&gt;[2011] Gigantes de Aço&lt;/title&gt; 注意不是每个&lt;programme&gt; 都有字段&lt;date&gt;
有人可以帮我吗?它需要使用sed 命令,而我将执行它的设备没有太多 RAM 和本机功能......

我正在尝试这样做,因为解析它的设备只能识别“标题”和“描述”字段...

一小段xml:

<programme start="20120923200000 -0300" stop="20120923222500 -0300" channel="T4H" program_id="0000278093" event_id="000000000887005" series_key="">
<title lang="pt">Gigantes de Aço</title>
<title lang="en">Real Steel</title>
<desc>Viva a adrenalina e o frenesi de uma atividade como a luta de Robôs. Esta é a história de um ex-campeão de boxe que, empurrado pelo forte desejo de uma criança, volta ao mundo da luta como um misterioso andróide. - www.revistaeletronica.com.br </desc>
<credits>
<director>Shawn Levy</director>
<actor>Hugh Jackman</actor>
<actor>Dakota Goyo</actor>
<actor>Evangeline Lilly</actor>
<actor>Anthony Mackie</actor>
<actor>Kevin Durand</actor>
<actor>Hope Davis</actor>
</credits>
<date>2011</date>
<category lang="pt">Filme</category>
<category lang="pt">Ação</category>
<country>EUA/Índia</country>
<video>
<colour>yes</colour>
</video>
<rating system="Advisory">
<value>Programa impróprio para menores de 14 anos</value>
</rating>
<star-rating>
<value>4/5</value>
</star-rating>
</programme>

【问题讨论】:

  • 不懂问题。

标签: xml linux sed move


【解决方案1】:

为工作使用正确的工具。正则表达式不是处理 Xml 的正确工具。

【讨论】:

    【解决方案2】:

    我会说使用 XSLT 重新创建您想要的 XML 方式。 (Ecplise 有一个很棒的 XSLT 引擎来实现这一点)。

    教程

    为工作使用正确的工具。正则表达式不是处理 Xml 的正确工具。 (Pawelless, 2012)

    【讨论】:

    • 问题是我不会在电脑上运行它,它应该在数字卫星电视解码器上执行,它没有太多可用资源... =\
    • 您是否查看过基于您的数字卫星电视型号的 XSLT 引擎? (我确定有一些可用的),我指的是 Eclipse 用于构建架构时。
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed '/^<programme/,/^<\/programme>/!b;/^<programme/{h;d};/^<title lang="en"/d;H;/^<\/programme>/!d;x;s/\(<title[^>]*>\)\(.*<date>\(.*\)<\/date>\)/\1[\3] \2/' file
    

    本质上,您想存储programme标签之间的行,删除英文标题并用日期修改剩余标题(或不修改)。

    解释:

    • /^&lt;programme/,/^&lt;\/programme&gt;/!b 只处理progrmame
    • /^&lt;programme/{h;d} 第一行,覆盖保持空间(HS)中的任何内容并删除
    • /^&lt;title lang="en"/d删除英文标题
    • H 将所有其他行附加到 HS
    • /^&lt;\/programme&gt;/!d删除除最后一行以外的所有行
    • x 与 HS 交换模式空间 (PS)
    • s/\(&lt;title[^&gt;]*&gt;\)\(.*&lt;date&gt;\(.*\)&lt;\/date&gt;\)/\1[\3] \2/修改标题

    【讨论】:

    • 在这里不起作用...它只是删除了标题“en”并将“program”加倍,“pt”标题仍然相同...
    • 我犯了一个错误,留下了不再需要的p 命令。该命令已被删除并针对您提供的示例进行了测试。我正在使用 GNU sed,也许这会给您带来问题?
    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2011-06-21
    • 2014-06-07
    相关资源
    最近更新 更多