2017-09-05 251 views
1

我想使用兩個字符串之間的sed模式匹配來解析一個文件並找到第一個匹配,使用第一個匹配,我試圖在循環中執行一些操作迭代,兩個字符串之間的sed的模式匹配打印所有的比賽,我只希望率先拿到賽:sed兩個字符串之間的模式匹配只顯示第一個匹配

文件:

},{ 
    "prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
    },{ 
    "prefix" : "CS", 
    "prefix" : "AE", 
    "last" : 1, 
    "last" : 0, 
    "month" : 130, 
    "month" : 0, 
    "today": 0, 
    "today": 20, 
    "yesterday": 0, 
    "yesterday": 38, 
    "agents": 0 
    },{ 
    "prefix" : "AF", 
    "prefix" : "CZ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 6, 

我想前綴與代理商之間提取,但只有前使用下面的sed命令進行匹配:

sed -n '/prefix/,/agents/p' /var/saas/stats/usage_1499245200.json.2 >> /var/saas/stats/try 

有沒有一種方法,我只能從第一次迭代usage_1499245200.json.2文件中提取第一個匹配並執行循環。

感謝, Sriram.V

+0

應該是什麼最後的結果(包括循環)? – RomanPerekhrest

+0

爲什麼python再次標籤?這與python無關。這甚至是有效的JSON,以及密鑰是重複的。 –

回答

1

您可以添加一個命令時遇到agents退出:

sed -n -e '/prefix/,/agents/p' -e '/agents/q' 

結果:

"prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
+0

非常感謝,每次我讀這個文件,我在一個循環下執行一組動作,在執行這些動作後,我在基於相同模式匹配的基礎上再次刪除行,當我嘗試使用時:sed - n -e'/ prefix /,/ agents/d'-e'/ agents/q'/var/saas/stats/usage_1499245200.json.2,由於-n,這會抑制輸出,我怎樣才能刪除就地而不刪除連續匹配並只刪除第一個,我應該使用-i嗎? – sriram2207

+0

'-i'只覆蓋當前文件。但這看起來像一個全新的問題。我建議你問另一個問題(這不是問題,你甚至可以把它鏈接到那個問題) –

2

使用awk

[[email protected] test]$ awk '/prefix/{found=1}found;/agents/{exit}' infile 
    "prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 

輸入

[[email protected] test]$ cat infile 
},{ 
    "prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
    },{ 
    "prefix" : "CS", 
    "prefix" : "AE", 
    "last" : 1, 
    "last" : 0, 
    "month" : 130, 
    "month" : 0, 
    "today": 0, 
    "today": 20, 
    "yesterday": 0, 
    "yesterday": 38, 
    "agents": 0 
    },{ 
    "prefix" : "AF", 
    "prefix" : "CZ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 6, 
+0

thta是等效的awk版本,awk在標籤中,所以很好的答案。 –

+0

非常感謝,每次我閱讀這個文件,我在一個循環下執行一組動作,在執行這些動作後,我基於相同的模式匹配再次刪除行,當我嘗試使用時:sed - n -e'/ prefix /,/ agents/d'-e'/ agents/q'/var/saas/stats/usage_1499245200.json.2,由於-n,這會抑制輸出,我怎樣才能刪除就地而不刪除連續匹配並只刪除第一個,我應該使用-i嗎? – sriram2207

+0

@ sriram2207,如果你有'gawk',那麼你可以使用'gawk -i inplace -v INPLACE_SUFFIX = .bak',否則'awk'{}'infile> tmpfile && mv tmpfile infile' –

相關問題