例如,如果我file.txt
包含以下内容
object = {
'name' : 'namestring',
'type' : 'type',
'real' : 'yes',
'version' : '2.0',
}
我只想提取version
所以输出为2.0
我将如何进行此操作?
答案 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)
使用grep
和cut
grep version file.txt | cut -d \' -f4