【问题标题】:How to insert one file into another file's marked place如何将一个文件插入另一个文件的标记位置
【发布时间】:2021-10-24 15:30:35
【问题描述】:

目标文件和源文件都是xml类型的文件。

我很难使用sed,因为它不能很好地处理特殊字符,而且那些 xml 中充满了它们。

我研究了awk 有一种方法,这是我的问题,因为我很难使用awk

编辑:

带有标记位置的主xml文件:

<?xml version="1.0" encoding="utf-8"?>
<ip>
<?processing instructions?>
<lista>

<!--> EKOLOGIA +5 <-->
<kategoria nazwa="EKO" thumb="/home/xvision/ip/swf/EKO/eko.png">
</kategoria>
<!-- KONIEC PAKIETU <-->

<!--temp-->
</lista>
</ip>

打算包含在主文件中的文件(第二个 xml):

<!--> PAKIET FUN 50 GIER <-->
<kategoria nazwa="EDU" thumb="/home/xvision/ip/swf/EDU/edu.png">
</kategoria>

最终文件:

<?xml version="1.0" encoding="utf-8"?>
<ip>
<?processing instructions?>
<lista>

<!--> EKOLOGIA +5 <-->
<kategoria nazwa="EKO" thumb="/home/xvision/ip/swf/EKO/eko.png">
</kategoria>
<!-- KONIEC PAKIETU <-->

<!--> PAKIET FUN 50 GIER <-->
<kategoria nazwa="EDU" thumb="/home/xvision/ip/swf/EDU/edu.png">
</kategoria>
</lista>
</ip>

【问题讨论】:

  • 一般来说,使用sedawk 来编辑XML 文件是个坏主意。请改用 XSLT 处理器,例如 xsltproc。使用document('') 函数创建一个样式表,在正确的位置包含文件。
  • @zx485 我可以包含 bash/sh 脚本吗?
  • @zx485 我发现xsltproc 是一个优雅的解决方案,但我仍然更喜欢awksed 中的解决方案,因为我还在学习它们

标签: xml awk sed text-processing


【解决方案1】:

这应该可以工作

$ sed -i -e '/<!--temp-->/{r file.insert' -e 'd}' file.main

在标记处插入文件并删除标记行,就地替换修改主文件。

-e 选项定义了一个脚本,我们可以多次使用,这里它用于两个单独的操作,匹配行插入文件,第二个块删除(匹配的)行。注意作为脚本边界的单引号。

【讨论】:

  • 您应该提到,-i 的语法需要 GNU sed(BSD sed 也有 -i 但这不是使用它的语法,因为它需要备份文件名)。
  • 哇,这一切都做得到!太感谢了!最后使用sed 转义特殊字符的解决方法。您能否解释一下:{r file.insert' -e 'd} 的工作原理?
【解决方案2】:

如果没有人可以使用支持 XML 的工具为您提供解决方案,这可能就是您所需要的:

$ awk '
    NR==FNR { lines = (NR>1 ? lines ORS : "") $0; next }
    $0 == "<!--temp-->" { $0 = lines }
    { print }
' second.xml main.xml
<?xml version="1.0" encoding="utf-8"?>
<ip>
<?processing instructions?>
<lista>

<!--> EKOLOGIA +5 <-->
<kategoria nazwa="EKO" thumb="/home/xvision/ip/swf/EKO/eko.png">
</kategoria>
<!-- KONIEC PAKIETU <-->

<!--> PAKIET FUN 50 GIER <-->
<kategoria nazwa="EDU" thumb="/home/xvision/ip/swf/EDU/edu.png">
</kategoria>
</lista>
</ip>

【讨论】:

  • 要真正学习 AWK,请阅读 Arnold Robbins 的《Effective AWK Programming, 5th Edition》一书。
  • 感谢您的建议!我仔细检查了,现在重定向可以正常工作了
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 2017-01-10
  • 2013-05-02
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多