如何提取引号之间的某些部分

时间:2015-09-02 20:08:12

标签: grep

例如,如果我file.txt包含以下内容

object = {
   'name'             : 'namestring',
   'type'             : 'type',
   'real'             : 'yes',
   'version'          : '2.0',
}

我只想提取version所以输出为2.0我将如何进行此操作?

2 个答案:

答案 0 :(得分:1)

我建议grep可能是错误的工具。尽管如此,使用grep两次是可能的。

grep 'version' input.txt | grep -Eo '[0-9.]+'

第一个grep隔离了您感兴趣的行,第二个grep只打印与正则表达式匹配的行的字符,在本例中为数字和句点。对于您的输入数据,这应该有效。

然而,这个解决方案在一些方面很薄弱。它不处理存在多个version行的情况,它非常依赖于文件的结构(即我怀疑如果所有行都连接成一个文件,那么你的文件在语法上是有效的长线)。它也使用管道,一般来说,如果有办法通过管道实现某些东西,而没有管道,则选择后者。

一个折衷方案可能是使用awk,假设你总是要按行拆分:

awk '/version/ { gsub(/[^0-9.]/,"",$NF); print $NF; }' input.txt

这与上面的双grep解决方案的功能完全相同。

如果您想在文件的该部分中处理多个变量,您可以使用awk执行以下操作:

  BEGIN {
    FS=":";
  }

  /{/ {
    inside=1;
    next;
  }
  /}/ {
    inside=0;
    print a["version"];
    # do things with other variables too
    #for(i in a) { printf("i=%s / a=%s\n", i, a[i]); }    # for example
    delete a;
  }
  inside {
    sub(/^ *'/,"",$1); sub(/' *$/,"",$1);  # strip whitespace and quotes
    sub(/^ *'/,"",$2); sub(/',$/,"",$2);   # strip whitespace and quotes
    a[$1]=$2;
  }

更好的解决方案是使用一种实际了解您正在使用的文件格式的工具。

答案 1 :(得分:0)

使用grepcut

的简单而干净的解决方案
grep version file.txt | cut -d \' -f4