【问题标题】:Formatting XML as comma delimited using sed or awk使用 sed 或 awk 将 XML 格式化为逗号分隔
【发布时间】:2017-08-13 09:08:12
【问题描述】:

我需要帮助格式化这个 xml 文件,以便以逗号分隔的形式导入到表格中。我玩过 sed 和 awk,但这是一场斗争。

例子:

<requestID>224</requestID>,
     <ErrorMessage>The following is required: PersonName </ErrorMessage>,
     <?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>
<requestID>615</requestID>,
    <ErrorMessage>The following is required: PersonName </ErrorMessage>,
     <?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>

结果:

 <requestID>224</requestID>,<ErrorMessage>The following is required: PersonName </ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>
 <requestID>615</requestID>,<ErrorMessage>The following is required: PersonName </ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>

我已经能够在我想要的地方添加逗号

 sed 's/ErrorMessage>$/ErrorMessage>,/; s/requestID>$/requestID>,/'

我认为删除标签会更好,但它也会删除所有空格。

  tr -d ' \t' <grep.xml  > test.xml

我不知道如何将一行移到上一行的末尾...

所以这部分工作......

 awk '{if ($0 ~ /<ErrorMessage>,*/) { printf "%s", $0; getline var; printf "%s\n", var} else {print $0}}' test.xml


    <requestID>260</requestID>,
            <ErrorMessage>The following is required: PersonName</ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>260</requestID></TCRMService>

但现在我无法将 ErrorMessage 移动到 RequestID 行的末尾......

请注意,在 ErrorMessage 行中,requestID 也在同一行。我认为关键是在

上寻找模式匹配
         </requestID>,

【问题讨论】:

  • 请求 ID 615 来自哪里?
  • 对不起,假设是615。每个requestID代表一个唯一的记录。
  • 它仍然在两行显示 ID 224 的“请求控制”。
  • 这实际上只是完整 xml 行中的示例文本。如果您愿意,我可以粘贴整行,但不想被太多信息淹没。
  • 不不,有代表性的摘录就好了,但它必须具有代表性;)见minimal reproducible example

标签: xml awk sed grep


【解决方案1】:

在 awk 中,非常 QnD(假设只有空格,没有制表符):

$ awk '{gsub(/^ +| +$|, *$/,"");printf "%s%s", ($0~/^ *<requestID>/?ORS:","), $0}END{print ""}' file

<requestID>224</requestID>,<ErrorMessage>The following is required: PersonName </ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>
<requestID>224</requestID>,<ErrorMessage>The following is required: PersonName </ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>

现在它只需要删除领先的换行符,但我需要赶公共汽车(我可以搭交通工具吗,伙计)。

【讨论】:

  • 所以我尝试了这个,我得到了错误:awk: 正则表达式中的非法主 ^ +|? +$|, *$ at +$|, *$ source line number 1 context is {gsub(/^ +|? +$|, >>> *$/,"")
  • 是的,? 作为正则表达式中的第一个字符是模棱两可的,所以一些 awks 会告诉你,而其他人可能会认为你的意思是文字。我还没有读过 Q 所以我知道它的意图是什么,但不管它是什么,单独使用 ? 开始一个正则表达式段是错误的。
  • 这是一个错字。无论如何,在这种情况下没有任何意义(修剪:gsub(/...|? +$|.../))。
【解决方案2】:

为什么不用 perl sn-p?随着波纹管的新行被删除,两个以上的空格被删除。没有添加逗号,因为您在主要问题中建议的输入文件已经有适当的逗号。

$ cat file3 |nl
     1  <requestID>224</requestID>,
     2       <ErrorMessage>The following is required: PersonName </ErrorMessage>,
     3       <?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>
     4  <requestID>615</requestID>,
     5      <ErrorMessage>The following is required: PersonName </ErrorMessage>,
     6       <?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>

$ perl -pe 's/\n//g; s/[[:space:]]{2,}//g; s/<\/TCRMService>/$&\n/g' file3 |nl
     1  <requestID>224</requestID>,<ErrorMessage>The following is required: PersonName </ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>
     2  <requestID>615</requestID>,<ErrorMessage>The following is required: PersonName </ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>224</requestID><DWLControl></TCRMService>

【讨论】:

  • 您选择使用 awk 解决方案,但我想知道这个解决方案是否适用于您的真实数据。
【解决方案3】:

试试这个 -

awk -v FS=""  '{gsub(/^[[:space:]]+/,"",$0);ORS=(NR%3==0?RS:FS)}1' f

【讨论】:

【解决方案4】:

所以这部分工作......

 awk '{if ($0 ~ /<ErrorMessage>,*/) { printf "%s", $0; getline var; printf "%s\n", var} else {print $0}}' test.xml


    <requestID>260</requestID>,
            <ErrorMessage>The following is required: PersonName</ErrorMessage>,<?xml version="1.0" encoding="UTF-8"?><TCRMService xmlns="http://www.ibm.com/mdm/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/mdm/schema MDMDomains.xsd"><RequestControl><requestID>260</requestID></TCRMService>

但是现在我无法将 ErrorMessage 移动到 RequestID 行的末尾......

请不要,在 ErrorMessage 行中,requestID 也在同一行中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多