在unix shell脚本中删除xml标记之间的新行 对文件#1234的付款 治疗sxc的信息 支付给shankar账户#999999 奥蒂银行 派对信息BB 支付给库马尔账户#999999 国家银行

在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

我要转换的上述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>

对文件#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>