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

Awk 两个字符串之间的sed模式匹配仅显示第一个匹配,awk,sed,Awk,Sed,我尝试使用两个字符串之间的sed模式匹配来解析文件并找到第一个匹配,使用第一个匹配,我尝试在循环中迭代执行一些操作,两个字符串之间的sed模式匹配打印所有匹配,我只希望获得第一个匹配: 文件: },{ "prefix" : "AD", "prefix" : "CQ", "last" : 0, "last" : 0, "month" : 0, "month" : 5, "today": 0, "today": 0, "yesterday":

我尝试使用两个字符串之间的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

当遇到
代理时,您可以添加一个退出命令:

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

使用
awk

[akshay@localhost 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
输入


非常感谢,每次我阅读这个文件时,我都会在循环下执行一组操作,在执行这些操作之后,我会根据相同的模式匹配再次删除行,当我尝试使用:sed-n-e'/prefix/,/agents/d'-e'/agents/q'/var/saas/stats/usage1499245200.json.2,这会抑制输出,因为-n,我如何在不删除连续匹配项的情况下就地删除,并且只删除第一个匹配项,我应该使用-I吗?
-I
只覆盖当前文件。但这看起来是一个全新的问题。我建议您问另一个问题(这不是问题,您甚至可以将其链接到该问题)最终结果应该是什么(包括循环)?为什么再次使用python标记?这与python无关。这甚至不是有效的JSON,密钥是重复的。thta是等效的awk版本,awk在标记中,回答得很好。非常感谢,每次我读这个文件时,我都在循环下执行一组操作,执行这些操作后,我会根据相同的模式匹配再次删除行,当我尝试使用:sed-n-e'/prefix/,/agents/d'-e'/agents/q'/var/saas/stats/usage1499245200.json.2时,由于-n的原因,这会抑制输出,我如何在不删除连续匹配项的情况下就地删除,而只删除第一个匹配项,我应该使用-I?@sriram2207,如果您有
gawk
,那么您可以使用
gawk-i inplace-v inplace\u后缀=.bak
,否则
awk'{}'infle>tmpfile&&mv tmpfile infle
@Jean-Françoisfare:谢谢:)@Jean-Françoisfare注意,在awk解决方案中,您只指定终止条件(
/agents/
)在sed版本中,必须指定两次吗?重复代码就是坏代码。awk方法还有其他优点(例如效率和适应性)-这是正确的解决方案,sed仅适用于
s/old/new/
[akshay@localhost 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,