解析2个文件

解析2个文件

我正在尝试解析 2 个名为和 的Microsoft Office文件。 请记住,文件的内容会随着每次更新而改变。v64.hashVersionDescriptor.xml
Microsoft Office

我想:

  1. 仅打印第二行v64.hash

    4172FC3F5555BA53FDF7F830773F0696
    16.0.9226.2126
    
  2. 打印tag inattribute="value"中的每个标签:<Version>VersionDescriptor.xml

    <?xml version="1.0" encoding="utf-8"?>
    <Version>
       <Available Build="16.0.9226.2126" I320Hash="0A735F1D1A6E7691006B0AC7A05F458A" I640Hash="2A462E7150280626AA23F8D362D048C3" I320Version="16.0.9226.2126" I640Version="16.0.9226.2126" />
       <DeliveryMechanism FFNRoot="492350f6-3a01-4f97-b9c0-c7c6ddf67d60" />
       <CreatedTimeUtc Value="05/11/2018 17:29" />
    </Version>
    

答案1

对于第一个问题,提取第二行v64.hash

$ sed -n '2p' v64.hash
16.0.9226.2126

或者,获取最后的文件行:

$ tail -n 1 v64.hash
16.0.9226.2126

对于第二个问题,attribute=value从该 XML 片段中提取所有对:

$ xmlstarlet sel -t -m '/Version/*/@*' -v 'concat(name(), "=", .)' -nl VersionDescriptor.xml
Build=16.0.9226.2126
I320Hash=0A735F1D1A6E7691006B0AC7A05F458A
I640Hash=2A462E7150280626AA23F8D362D048C3
I320Version=16.0.9226.2126
I640Version=16.0.9226.2126
FFNRoot=492350f6-3a01-4f97-b9c0-c7c6ddf67d60
Value=05/11/2018 17:29

这是使用XML小星首先匹配VersionXML 文档中节点的所有子节点的所有属性,然后创建属性名称和值的串联(使用=中间值)。

答案2

对于第一个文件,最好的方法是执行tail -n 1 v64.hash.
这将为您提供 .txt 文件中的最后一行文本v64.hash

解析第二个文件,我会这样做:

sed -En '/^\s*<Version>\s*$/,/^\s*<\/Version>\s*$/ {
    /^\s*<Version>\s*$/ d
    /^\s*<\/Version>\s*$/ d

    s|^\s*<[^ ]+\s*(.*")\s*/>\s*|\1|
    p
}' VersionDescriptor.xml

-E使用扩展正则表达式。

-n除非明确告知,否则不要打印输出。

/^\s*<Version>\s*$/,/^\s*<\/Version>\s*$/[spaces]<Version>[spaces]仅适用于和之间的行[spaces]</Version>[spaces],包括这些行。

/^\s*<Version>\s*$/ d如果该行是[spaces]<Version>[spaces],则忽略它。

/^\s*<\/Version>\s*$/ d如果该行是[spaces]</Version>[spaces],则忽略它。

s|^\s*<[^ ]+\s*(.*")\s*/>\s*|\1|删除[spaces]<[spaces]行首和[spaces]/>[spaces]行尾的 。

p替换后打印当前行。

相关内容