sed两个字符串之间的模式匹配只显示第一个匹配

问题描述:

我想使用两个字符串之间的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,以及密钥是重复的。 –

您可以添加一个命令时遇到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'只覆盖当前文件。但这看起来像一个全新的问题。我建议你问另一个问题(这不是问题,你甚至可以把它链接到那个问题) –

使用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' –