【发布时间】:2011-03-18 15:57:29
【问题描述】:
我有一个包含 2 行的文件,每行都有键值对。 "//" 用作注释样式。
1. key = "string_key_value" //string key
如何提取不带引号的 string_key_value?
2. key =100 //integer value
如何从这里提取 100 作为整数?
我必须在另一个 unix 命令中重新使用这些值。
【问题讨论】:
我有一个包含 2 行的文件,每行都有键值对。 "//" 用作注释样式。
1. key = "string_key_value" //string key
如何提取不带引号的 string_key_value?
2. key =100 //integer value
如何从这里提取 100 作为整数?
我必须在另一个 unix 命令中重新使用这些值。
【问题讨论】:
试试这个:
perl -wlne'print $1 if /key\s*=\s*\"?([^\"; ]+)[\" ;]/' source.cpp
它会在key = 之后和结束引号/空格/分号之前提取所有内容。如果你有带转义引号的字符串,这将失败,所以只有在你需要一个快速而肮脏的解决方案时才应该使用它。如果您正在解析生产数据、日志文件等,您应该在 CPAN 上使用 Parse:: 系列中的模块,而不是使用正则表达式。
我必须在另一个 unix 命令中重复使用这些值。
也许您应该在一个中心位置(如常量文件或配置文件)定义这些值,而不是尝试解析源代码。它更不容易出错(更不用说 hacky)。
【讨论】:
say for // 比print $1 if // 更简洁
您可以查看“Gory details of parsing quoted constructs”。 perldoc 是你的朋友。
编辑:抱歉,我认为这不是您要找的。它仍然可能值得一读,所以我将其留在那里。
这应该更接近你想要的:
my ($key, $value) = $line =~ /(\S+)\s*=\s*"?(.*)"?/
【讨论】:
在我看来,您正在尝试解析键/值对,然后您应该查看这个 StackOverflow 问题的答案Regular expression for parsing name value pairs
或尝试以下链接中的解决方案:
或者简单地用'='和干净的引号分割每一行。
【讨论】:
如果您只有 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
【讨论】: