【问题标题】:Regex for obtaining value for specific key in xml file [closed]用于获取 xml 文件中特定键值的正则表达式 [关闭]
【发布时间】:2020-07-27 09:21:11
【问题描述】:

我需要使用正则表达式获取键“CFBundleShortVersionString”的值。我已经搜索了很多,但我没有找到任何正则表达式可以获取下一行的值。所以任何人都可以帮助我使用获取值的正则表达式,或者是否有任何其他方式可以获取特定键的值。请告诉我。

<dict>
        <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>tel</string>
            <string>itms-beta</string>
            <string>itms-apps</string>
        </array>
        <key>CFBundleDisplayName</key>
        <string>Hire ASAP</string>
        <key>CFBundleShortVersionString</key>
        <string>1.4.2</string>
    </dict>

【问题讨论】:

  • 为什么要使用正则表达式?这不是一个好主意。请改用解析器。
  • @WiktorStribiżew 一个对我有用并接受答案的人
  • 您打算如何提取该值?规则是什么?
  • @WiktorStribiżew 我可以使用正则表达式或任何其他方法,我的要求是我必须将用户输入的值写入该特定键我的意思是我已经用用户输入值替换了该键的值。

标签: regex shell perl sed


【解决方案1】:

由于您没有指定语言,因此我使用 Python 库中的 re 模块创建了它。这里有一个快速解决您的问题的方法:

version = re.findall(r"CFBundleShortVersionString.*\n.*&lt;string&gt;(.+)&lt;/string&gt;", xml_file)

编辑:由于您要求使用 shell 解决方案,只需将该行放在 .py 脚本中并将 XML 文件作为参数传递。

【讨论】:

    【解决方案2】:

    使用正则表达式解析 XML 是一个糟糕的主意。请不要那样做。

    XML 正则表达式的等价物称为 XPath。我使用XML::LibXML 对 XML 文档运行 XPath 查询。

    这样的事情可以满足你的要求:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use feature 'say';
    
    use XML::LibXML;
    
    my $key = 'CFBundleDisplayName';
    my $xml = do { local $/; <DATA> };
    
    my $dom = XML::LibXML->load_xml(string => $xml);
    
    # XPath expression.
    # Look for a "string" node where the first
    # preceding sibling "key" node has text that
    # is the key you are looking for and return the
    # text of the node you've found.
    
    my $xpath = "//string[preceding-sibling::key[position()=1][text()='$key']]/text()";
    
    say "XPath: $xpath";
    
    for ($dom->findnodes($xpath)) {
      say $_->to_literal;
    }
    
    __DATA__
    <dict>
      <key>LSApplicationQueriesSchemes</key>
      <array>
        <string>tel</string>
        <string>itms-beta</string>
        <string>itms-apps</string>
      </array>
      <key>CFBundleDisplayName</key>
      <string>Hire ASAP</string>
      <key>CFBundleShortVersionString</key>
      <string>1.4.2</string>
    </dict>
    

    【讨论】:

    • 好的,如果我想用新值重写密钥,这是获取值我该怎么做
    • @ManojCK:我将密钥放在一个变量中,以便尽可能轻松地更改它。您甚至可以通过用户输入进行设置。
    • 我不想更改密钥我想替换该密钥的值
    • @ManojCK:好的。嗯,这个要求不在你原来的问题中(并且这个问题已经结束),所以你应该在一个新问题中提出这个要求。
    猜你喜欢
    • 2020-05-10
    • 2021-07-08
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2014-01-31
    • 2013-01-12
    相关资源
    最近更新 更多