使用sed或perl在元组内部和/或外部获取变量

时间:2014-10-08 21:33:16

标签: linux perl shell sed

输入文件:

{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

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

name内的custom值的预期输出:

自定义名称中的sed命令

hello
test

自定义名称外的sed命令:

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

注意:name可以出现在文件的任何位置 - 开头,中间或结尾 - 或者可以不在。

perl对我也有用。 谢谢。

2 个答案:

答案 0 :(得分: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}'

答案 1 :(得分: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在命令行上执行代码。