在unix shell脚本中删除xml标记之间的新行 对文件#1234的付款 治疗sxc的信息 支付给shankar账户#999999 奥蒂银行 派对信息BB 支付给库马尔账户#999999 国家银行
我要转换的上述XML如下所示,这意味着数据包装在开始标记和结束标记之间的下一行中。应该在下面这样的一行中在unix shell脚本中删除xml标记之间的新行 对文件#1234的付款 治疗sxc的信息 支付给shankar账户#999999 奥蒂银行 派对信息BB 支付给库马尔账户#999999 国家银行,xml,bash,shell,unix,formatting,Xml,Bash,Shell,Unix,Formatting,我要转换的上述XML如下所示,这意味着数据包装在开始标记和结束标记之间的下一行中。应该在下面这样的一行中 <mstr> <srt>Payment towards File# 1234</srt> <msg>info for treat sxc Pay to shankar A/C#999999 bank of ooty</msg> <ins>info for party BB Pay to kum
<mstr>
<srt>Payment towards File# 1234</srt>
<msg>info for treat sxc
Pay to shankar A/C#999999
bank of ooty</msg>
<ins>info for party BB
Pay to kumar A/C#999999
state bank</ins>
</mstr>
对文件#1234的付款
向shankar A/C#999999陈银行付款的信息
向kumar A/C#999999国家银行支付乙方BB的信息
我已经尝试了下面的方法,通过参考网络答案。想了解下面的awk命令在寻找任何其他替代方法来解决我的问题时做了什么吗
<mstr>
<srt>Payment towards File# 1234</srt>
<msg>info for treat sxc Pay to shankar A/C#999999 bank of chen</msg>
<ins>info for party BB Pay to kumar A/C#999999 state bank</ins>
</mstr>
awk'{printf/^使用XML感知工具来处理XML,使用sed
或awk
可能很容易破坏数据
例如,在我维护的一个工具中,它实际上是一个包装器,您可以执行以下操作:
openfile.xml;
对于/mstr/*set.normalize空格(.);
保存:b;
输出几乎是预期的-它只是保持“ooty”而不是“chen”,但这可以通过添加
awk '{printf /^</&&!/^<\//?RS $0:$0}'
您想要做的事情—删除文本开头和结尾的空格字符,并将任何空格和换行符序列折叠为文本中的单个空格字符—在XML中称为空白规范化,并且可以由许多XML处理工具现成完成,而无需特别编写shell脚本您可以使用tidy
(可在上获得,并且可能已经安装在您的机器上,或者可以通过Debian/Ubuntu上的sudo-apt-get-install-tidy
)进行安装)如下操作,以规范输入的空白(假定存储在test.xml
):
awk one liner打印任何输入行($0
),省略换行符(使用printf()
而不是print()
),并在输出行之前添加RS
(记录分隔符,默认情况下为制表符),如果该行以类似开始元素标记的内容开头(/以下是对awk
脚本的解释
tidy -xml -w 80 test.xml
awk'{printf/^我的建议是,尽管肯定有更好的替代方案,但还是在文件上使用awk。PYX格式是从SGML ESIS格式派生的XML文档的面向行表示形式(请参阅ESIS-ISO 8879元素结构信息集规范,ISO/IEC JTC1/SC18/WG8 N931(ESIS))
PYX格式非常易于描述和理解。每行上的第一个字符标识行的内容类型。内容不直接跨行,尽管连续行可能包含相同的内容类型。对于标记属性,属性名称和值仅用空格分隔,不使用空格额外引号。前缀字符为:
awk '{printf /^</&&!/^<\//?RS $0:$0}'
因此,我们可以要求xmlstarlet将XML转换为PYX,使用awk删除行,然后将其转换回XML文件:
( start-tag
) end-tag
A attribute
- character data (content)
? processing instruction
我将使用带有XML解析模块的脚本语言。例如,使用ruby:
$ xmlstarlet pyx file.xml | sed -E '/^-\\n/b;/^-/s/\\n +/ /g' | xmlstarlet p2x -
结果在文件中
ruby -r'rexml/document' -e '
file = ARGV.shift
doc = REXML::Document.new(File.new(file))
doc.elements.each("/mstr/*") {|child| child.text = child.text.gsub(/\n\s*/, " ")}
File.open(file, "w") {|f| f.puts(doc.to_s)}
' file.xml
对文件#1234的付款
支付给shankar A/C#999999 ooty银行的治疗sxc信息
向kumar A/C#999999国家银行支付乙方BB的信息
你找到的答案对你有用吗?如果没有,你能展示它给出的输出吗?不要使用面向行的工具解析XML。是的,我想了解awk在这里是如何应用的。有些人称之为awk,其他人称之为awk,只有少数人称之为awk。简言之,永远不要用正则表达式解析XML或HTML!你尝试过xmlstarle之类的XML解析器吗t
,xmllint
或xsltproc
?xmllint我使用了这个,但没有帮助这不是代码插入这是代码文档。请将代码和数据添加为文本(),而不是图像。图像:A)不允许我们复制和粘贴代码/错误/数据进行测试;B)不允许基于代码/错误/数据内容进行搜索;以及。通常,文本格式的代码/错误/数据>>>>代码/错误/数据作为图像>>无任何内容。如果图像添加了一些重要内容,而不仅仅是文本代码/错误/数据,则仅应在代码格式的文本之外使用图像。以上图像可以是r看起来很有趣。我注意到“XSH2手册页”链接断了。@格伦杰克曼:谢谢,我会修好它。爱这个。我可能会建议<代码> SEE-E/\\n[[::Suff::] ] [[[[::Suff:] ] ] /\ 1 /g′<代码>在中间,但这不是一个很大的改进。+ 1把ECT投入讨论;一些我不敢做的事情,因为它太老了。(Perl时代),尽管这是将SGML/XMLish输入带到面向行的Unix工具的最常用技术。顺便说一句,您还可以使用OpenSP SGML处理包中的onsgmls
/nsgmls
程序从任何SGML或XML生成ESI
ruby -r'rexml/document' -e '
file = ARGV.shift
doc = REXML::Document.new(File.new(file))
doc.elements.each("/mstr/*") {|child| child.text = child.text.gsub(/\n\s*/, " ")}
File.open(file, "w") {|f| f.puts(doc.to_s)}
' file.xml
<mstr>
<srt>Payment towards File# 1234</srt>
<msg>info for treat sxc Pay to shankar A/C#999999 bank of ooty</msg>
<ins>info for party BB Pay to kumar A/C#999999 state bank</ins>
</mstr>