用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来代替它
- 更换过程中,间距/标签丢失。我怎样才能保存它
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