如何使用perl / awk提取引用的字符串?

时间:2010-07-20 20:18:16

标签: perl unix awk

我有一个文件,其中2行每行都有键值对。 “//”用作评论样式。

1. key = "string_key_value" //string key

如何在没有引号的情况下提取string_key_value?

2. key =100 //integer value

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

我要在另一个unix命令中重用这些值。

4 个答案:

答案 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