2011-08-12 58 views
0

所以我得遵循這種模式很長的txt文件:使用grep在BBEdit中第一後更換模式的每一個實例

}, 
"303" : 
{ 
    "id" : "4k4hk2l", 
    "color" : "red", 
    "moustache" : "no" 
}, 
"303" : 
{ 
    "id" : "4k52k2l", 
    "color" : "red", 
    "moustache" : "yes" 
}, 
"303" : 
{ 
    "id" : "fask2l", 
    "color" : "green", 
    "moustache" : "yes" 
}, 
"304" : 
{ 
    "id" : "4k4hf4f4", 
    "color" : "red", 
    "moustache" : "yes" 
}, 
"304" : 
{ 
    "id" : "tthj2l", 
    "color" : "red", 
    "moustache" : "yes" 
}, 
"304" : 
{ 
    "id" : "hjsk2l", 
    "color" : "green", 
    "moustache" : "no" 
}, 
"305" : 
{ 
    "id" : "h6shgfbs", 
    "color" : "red", 
    "moustache" : "no" 
}, 
"305" : 
{ 
    "id" : "fdh33hk7", 
    "color" : "cyan", 
    "moustache" : "yes" 
}, 

,我試圖格式化它是一個結構如下正確的JSON對象....

"303" : 
    { "list" : [ 
    { 
     "id" : "4k4hk2l", 
     "color" : "red", 
     "moustache" : "no" 
    }, 
    { 
     "id" : "4k52k2l", 
     "color" : "red", 
     "moustache" : "yes" 
    }, 
    { 
     "id" : "fask2l", 
     "color" : "green", 
     "moustache" : "yes" 
    } 
    ] 
    } 
"304" : 
    { "list" : [ 
etc... 

意思是我找^「\ d \ d \ d」的所有模式:而離開第一唯一的,但刪除所有後續者(例如,留下「303」的第一個實例:,但完全刪除其餘的,然後保留「304」的第一個實例:,但是完全刪除其餘的人等等)。

我一直在嘗試將應用程序的BBEdit,這對搜索一個grep的選項之內做到這一點/替換。我的模式匹配功能太弱,無法完成此任務。有任何想法嗎?或者更好的方法來完成這項任務?

回答

1

您不能捕獲重複捕獲組。捕獲將始終只包含組的最後一場比賽。所以你不可能通過單一的搜索/替換來做到這一點,除了愚蠢的重複你的團隊模式。但即使如此,只有知道結果組中元素的最大數量時,這也是一種解決方案。

說我們有一個特林那是你的數據的簡化版本:

1a;1b;1c;1d;1e;2d;2e;2f;2g;3x;3y;3z; 

我們看到,元素的最大數是5,所以我們重複捕獲組的5倍。

/([0-9])([a-z]*);?(\1([a-z]);)?(\1([a-z]);)?(\1([a-z]);)?(\1([a-z]);)?/ 

並更換有

\1:\2\4\6\8\10; 

然後我們得到想要的結果:

1:abcde;2:defg;3:xyz; 

,如果你在很匆忙的是你可以應用該技術對數據(和2個後天,我想你不會),但使用一些腳本語言將是更好和更乾淨的解決方案。

對於我的簡化示例,您必須遍歷/([0-9])[a-z];?(\1[a-z];?)*/的匹配項。那些將是:

1a;1b;1c;1d;1e; 
2d;2e;2f;2g; 
3x;3y;3z; 

在那裏,您可以捕獲所有值並將它們綁定到響應鍵,每個迭代只有一個響應鍵。

相關問題