【问题标题】:how to extract quoted strings using perl/awk?如何使用 perl/awk 提取带引号的字符串?
【发布时间】:2011-03-18 15:57:29
【问题描述】:

我有一个包含 2 行的文件,每行都有键值对。 "//" 用作注释样式。

1. key = "string_key_value" //string key

如何提取不带引号的 string_key_value?

2. key =100 //integer value

如何从这里提取 100 作为整数?

我必须在另一个 unix 命令中重新使用这些值。

【问题讨论】:

    标签: perl unix awk


    【解决方案1】:

    试试这个:

    perl -wlne'print $1 if /key\s*=\s*\"?([^\"; ]+)[\" ;]/' source.cpp
    

    它会在key = 之后和结束引号/空格/分号之前提取所有内容。如果你有带转义引号的字符串,这将失败,所以只有在你需要一个快速而肮脏的解决方案时才应该使用它。如果您正在解析生产数据、日志文件等,您应该在 CPAN 上使用 Parse:: 系列中的模块,而不是使用正则表达式。

    我必须在另一个 unix 命令中重复使用这些值。

    也许您应该在一个中心位置(如常量文件或配置文件)定义这些值,而不是尝试解析源代码。它更不容易出错(更不用说 hacky)。

    【讨论】:

    • 我个人认为say for //print $1 if // 更简洁
    • 效果很好。刚刚添加 '?'在正则表达式的最后,因为它在少数情况下不起作用。 perl -wlne'print $1 if /key\s*=\s*\"?([^\"; ]+)[\" ;]?/'
    【解决方案2】:

    您可以查看“Gory details of parsing quoted constructs”。 perldoc 是你的朋友。

    编辑:抱歉,我认为这不是您要找的。它仍然可能值得一读,所以我将其留在那里。

    这应该更接近你想要的:

    my ($key, $value) = $line =~ /(\S+)\s*=\s*"?(.*)"?/
    

    【讨论】:

    • 患难见真情!
    【解决方案3】:

    在我看来,您正在尝试解析键/值对,然后您应该查看这个 StackOverflow 问题的答案Regular expression for parsing name value pairs

    或尝试以下链接中的解决方案:

    或者简单地用'='和干净的引号分割每一行。

    【讨论】:

      【解决方案4】:

      如果您只有 key=value 对,则只需使用 awk 的 gsub() 删除引号

      $ echo 'key = "string_key_value"' | awk '{gsub("\042","",$NF);print $NF}'
      string_key_value
      

      或者如果只是使用 shell (bash)

      $ string='key = "string_key_value"'
      $ IFS="="
      $ eval echo \$$#
       "string_key_value"
      $ result=$(eval echo \$$#)
      $ echo $result
       "string_key_value"
      $ echo ${result//\"}
       string_key_value
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-28
        • 2013-01-22
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 2013-04-09
        • 2023-03-31
        相关资源
        最近更新 更多