如何多次使用反向引用?

时间:2016-11-14 08:28:47

标签: perl shell awk sed

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和值信息?

5 个答案:

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

答案 1 :(得分: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*

答案 2 :(得分:1)

尝试以下

 "buildOptions": {
    "platform": "anycpu",
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

答案 3 :(得分: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):删除列的最后一个字符     在我们的案例中是“,”。

答案 4 :(得分:1)

使用GNU awk for 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