用awk或sed替换xml文件的部分

用awk或sed替换xml文件的部分,xml,regex,bash,sed,awk,perl,Xml,Regex,Bash,Sed,Awk,Perl,我想用另一个字符串替换和(包括restApi标记)之间的以下部分: ... <restApi> <baseUrl>https://domain.com/nexus</baseUrl> <forceBaseUrl>true</forceBaseUrl> <uiTimeout>60000</uiTimeout> </restApi> ... 。。。 https://dom

我想用另一个字符串替换
(包括restApi标记)之间的以下部分:

...
  <restApi>
    <baseUrl>https://domain.com/nexus</baseUrl>
    <forceBaseUrl>true</forceBaseUrl>
    <uiTimeout>60000</uiTimeout>
  </restApi>
...
。。。
https://domain.com/nexus
真的
60000
...
使用awk,我使用以下命令进行替换:

awk '/<restApi>/,/<\/restApi>/ {sub(/.*/,"<sometag>stuff</sometag>")}1' file.xml
awk'//,//{sub(/.*/,“stuff”)}1'file.xml
问题是awk用替换字符串替换每一行,因此我得到以下输出:

...
<sometag>stuff</sometag>
<sometag>stuff</sometag>
<sometag>stuff</sometag>
<sometag>stuff</sometag>
<sometag>stuff</sometag>
...
。。。
东西
东西
东西
东西
东西
...
  • 我在awk命令中缺少了什么,结果中只有一个
    “stuff”
  • 我如何使用sed来代替它
  • 更换过程中,间距/标签丢失。我怎样才能保存它

如果您将awk输出导入
uniq
,您可能会得到您想要的。

使用或解析
xml
是不正确的方法。您应该使用带有解析器的语言。这里我将提供一个示例及其
XML::Twig
模块:

假设以下输入文件:

<root>
  <restApi>
    <baseUrl>https://domain.com/nexus</baseUrl>
    <forceBaseUrl>true</forceBaseUrl>
    <uiTimeout>60000</uiTimeout>
  </restApi>
  <t>data</t>
  <restApi>
    <baseUrl>https://domain.com/nexus</baseUrl>
    <forceBaseUrl>true</forceBaseUrl>
    <uiTimeout>60000</uiTimeout>
  </restApi>
</root>
像这样运行:

perl script.pl xmlfile
这将产生:

<root>
  <sometag>stuff</sometag>
  <t>data</t>
  <sometag>stuff</sometag>
</root>

东西
数据
东西

正如我在上面的评论中指出的,请使用支持XML的工具

XSLT就是其中之一,因此这里有一个简单的样式表,它可以替换
元素,而不涉及其他任何内容,包括空格和制表符

<!-- newRestApi.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="restApi">
    <sometag>stuff</sometag>
  </xsl:template>
</xsl:stylesheet>

解决您的问题的单行纯awk解决方案

awk  'BEGIN {A = 1};/<restApi>/{A=0; print "<sometag>stuff</sometag>"};/.*/ { if ( A == 1) print $0};/<\/restApi>/{A=1}; ' file.xml
awk'开始{A=1}//{A=0;打印“内容”};/.*/{如果(A==1)打印$0}//{A=1};'file.xml

如果你经常使用XML转换,你应该考虑使用XSLT,正如其他人所说的:

<代码> *>代码>这意味着行上的所有字符,所以每一行都是变化的。预期的输出是什么?错误1:XML不是字符串。您不应该对XML进行字符串处理。使用类似xsltproc的XML感知工具。@Jotne预期的输出是。。。stuff…@Tomalak对于简单的任务,您可以使用
awk
sed
和其他工具来做您喜欢的事情,但是最好使用另一种工具来更大规模地处理xml文件,yes@PapelPincel用什么替换什么?我确实看到你喜欢一些新的,但不是要替换的东西。+1表示理智的方法,加上证明做正确的事情并不困难。
xsltproc newRestApi.xsl input.xml > output.html
awk  'BEGIN {A = 1};/<restApi>/{A=0; print "<sometag>stuff</sometag>"};/.*/ { if ( A == 1) print $0};/<\/restApi>/{A=1}; ' file.xml