2016-11-14 69 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