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....
我想仅过滤id
和value
信息。例如无论什么过程给我这个:
"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和值信息?
答案 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 ","
使用,
作为分隔符来合并提取的模式
仅捕获id
和value
$ 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)
仅限于id
或value
,但在非捕获组中,以便只将整个提取的文本传递到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
说明:
"x+|y+|z+"
:BEGIN块中的多个字段分隔符。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