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