2014-10-08 45 views
0

输入文件:获取变量使用内部和/或元组外SED或Perl

{custom:{ver:120,name:hello,form:123},name:world,browser:ie} 
{custom:{ver:130,name:test,form:123},browser:ie} 

sed命令:

sed 's/^.*name:\([^,]*\).*$/\1/' input.txt 

输出:

world 
test 

如何区分元组内的变量和元组外部的变量?

预期输出的namecustom值:

内自定义名称

sed命令

hello 
test 
以外的自定义名称

sed命令:

world 
blank or {custom:{ver:130,name:test,form:123},browser:ie} 

注:name可以随时随地出现文件 - 开始,中间或结束 - 或可以不存在。

perl也会为我工作。 谢谢。

回答

1

定制内部名称使用,而单纯的正则表达式:

perl -lne 'print /custom:\{[^{}]*name:([^,}]*)/ ? $1 : ""' input.txt 

输出:

hello 
test 

名称自定义外:

perl -lne 'print /custom:\{[^{}]*\}(*SKIP)(*FAIL)|name:([^,}]*)/ ? $1 : ""' input.txt 

输出:

world 

开关

  • -l:启用行结束处理
  • -n:创建一个while(<>){...}循环在你的输入文件中的每一行“ ”。
  • -e:通知perl在命令行上执行代码。
+0

他们的工作很好,当线路上有名字,当存在,它只是删除行的行没有名字。在第二个命令输出中,第二行中应该有空行,因为输入中没有名称 – user2711819 2014-10-08 22:02:02

+0

然后使用条件运算符而不是if。 – Miller 2014-10-08 22:03:45

2

如果将它视为JSON,阅读和维护就简单多了。

use JSON qw(decode_json); 
while (<>) { 
    s/(\w+)/"$1"/g; 
    my $data = decode_json($_); 
    print($data->{name}, "\n") if $data->{name}; 
} 

作为一个班轮:

#Any version 
perl -MJSON -nle' 
    s/(\w+)/"$1"/g; 
    my $data = decode_json($_); 
    print $data->{name} if $data->{name}; 
' 

#5.10+ 
perl -MJSON -nE' 
    s/(\w+)/"$1"/g; 
    my $data = decode_json($_); 
    say $data->{name} if $data->{name}; 
' 

#5.14+ 
perl -MJSON -nE' 
    my $data = decode_json(s/(\w+)/"$1"/gr); 
    say $data->{name} if $data->{name}; 
' 

#5.14+ 
perl -MJSON -nE'say for grep $_, decode_json(s/(\w+)/"$1"/gr)->{name}' 
+0

感谢这也买了很慢,它看起来我需要安装json :: XS模块来加速解析。花了1小时解析25 MB文件中的55列。 – user2711819 2014-10-14 17:46:39

+0

我追求可靠性和灵活性,而无需在开发时花费太多。是的,它没有解决方案的速度。是的,如果您尚未安装JSON :: XS,那么安装JSON :: XS会大大加快速度。 – ikegami 2014-10-14 17:50:47

+0

与安装JSON :: XS模块,性能将相当于hakish解决方案吗? (用解决方案,25分钟的文件在一两分钟内解析)。如果性能几乎相等,我需要推荐我的公司安装。谢谢 !! – user2711819 2014-10-15 15:37:41