输入文件:
{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
可以出现在文件的任何位置 - 开头,中间或结尾 - 或者可以不在。
答案 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
在命令行上执行代码。