2016-11-14 123 views
3

dump.data如下:如何多次使用反向引用?

x"xxx":111,"xxxx":2222,xxxx"id":123,xxxxxx"value":321,xxxxxx"id":234,xxxxxx"value":432,xx 
x"xxx":yyy,"xxxx":zzz,xxxx"id":223,xxxxxx"value":221,xxxxxx"id":224,xxxxxx"value":232,xxxx.... 

我想过滤只有idvalue信息。例如无论过程之后给了我这样的:

"id":123,"value":321,"id":234,"value":432 
"id":223,"value":221,"id":224,"value":232 

什么在我脑海中使用反向引用,即SED:

sed 's|.*\("id":[0-9]*\).*\("value":[0-9]*\).*|\1,\2|' dump.data 

,给了我这样的:

"id":234,"value":432 
"id":224,"value":232 

但如何我可以得到全部的ID和价值信息?

+1

这可能有助于为第一步:'grep的-o '“[^,] *' dump.data' – Cyrus

+0

感谢您的时间,问题更新。 @Cyrus – hedleyyan

+2

这可能有助于第二步:'grep -oE'“(id | value)[^,] *'dump.data' – Cyrus

回答

4

简体版已经出现

$ perl -lne 'print join ",", /"[^"]+":\d+/g' dump.data 
"id":123,"value":321,"id":234,"value":432 
"id":223,"value":221,"id":224,"value":232 
  • "[^"]+":\d+模式提取
  • join ","使用,作为分离提取的图案相结合


为了仅捕捉idvalue

$ perl -lne 'print join ",", /"(?:id|value)":\d+/g' dump.data 
"id":123,"value":321,"id":234,"value":432 
"id":223,"value":221,"id":224,"value":232 
  • (?:id|value)限制到仅idvalue,但使得只有整个提取的文本被传递到join
在非捕获组
+0

我试过'perl -lne'打印连接“,”,/“(id | value)”:\ d +/g'dump.data',它只产生'id,value,id,value'。 – hedleyyan

+0

'perl -lne'print join“,”,/(“(id | value)”:\ d +)/ g'dump.data'正常工作!我假设打印作品为'1'捕获? – hedleyyan

+0

你确定'/(“(id | value)”:\ d +)/ g'有效吗?它会不必要地添加额外的'id'和'value'来输出,因为'(id | value)' – Sundeep

2

使用while循环在时间捕捉一对,每次

perl -lne 'print "$1:$2" while /("[^"]+"):(\w+),/g' data.txt 

打印,你可以将其重定向到一个文件中,加入> output.txt到该行的末尾。

这会每行输出一对。将每条线对保持在一条线上

perl -nE 'chomp; print "$1:$2," while /("[^"]+"):(\w+),/g; say ""' data.txt 

这会在最后一对线后留下额外的逗号。为了避免

perl -lne 'push @m, "$1:$2" while /("[^"]+"):(\w+),/g; print join ",", @m; @m =()' data.txt 

这形成每对"$1:$2"并将其添加到阵列。一旦该行被处理,它将打印它们加入,。该阵列然后被清空@m =()为下一行。

如果可能有多余的空格加上\s*,如\s*:\s*

+1

Thx为你的时间,但这产生了与我上面提到的sed相同的结果。 – hedleyyan

+0

@hedleyyan固定 – zdim

+0

如果dump.data有多行,并且我希望结果保留在相对行中呢? Q更新。谢谢! @zdim – hedleyyan

1

尝试如下的其他解决方案

perl -ne 'while($_=~m/(?:("id":\d+)|("value":\d+))/g){my $result = $1 // $2; print "$result ";} print "\n";' data.dump 
+0

虽然此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –

1

下面试试awk解决方案 -

#awk 'BEGIN{FS="x+|y+|z+"} {print $7,$8,$9,substr($10,1,length($10)-1)}' OFS="" kk.txt 
"id":123,"value":321,"id":234,"value":432 
"id":223,"value":221,"id":224,"value":232 

说明:

  1. "x+|y+|z+":多个字段分隔符在BEGIN块。
  2. substr($10,1,length($10)-1):删除我们的案例中“,”列 的最后一个字符。
1

随着GNU AWK为FPAT:

awk -v FPAT='"(id|value)":[0-9]+' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i<NF?",":ORS)}' file 
"id":123,"value":321,"id":234,"value":432 
"id":223,"value":221,"id":224,"value":232 
+1

好的!直到你...... Thx,我才知道FPAT – hedleyyan