【问题标题】:sed Pattern matching between two strings only display first matchsed 两个字符串之间的模式匹配只显示第一个匹配
【发布时间】:2017-09-05 12:08:54
【问题描述】:

我正在尝试使用两个字符串之间的 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 期间从文件中提取第一个匹配项并执行循环。

谢谢, 斯里拉姆.V

【问题讨论】:

  • 最终结果应该是什么(包括循环)?
  • 为什么又是python标签?这与python无关。这甚至不是有效的 JSON,而且键是重复的。

标签: awk sed


【解决方案1】:

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

输入

[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,

【讨论】:

  • 那是等效的 awk 版本,awk 在标签中,所以很好的答案。
  • 非常感谢,而且每次,我都会阅读这个文件,我正在循环下执行一组操作,执行这些操作后,我会根据相同的模式匹配再次删除行,当我尝试使用: sed -n -e '/prefix/,/agents/d' -e '/agents/q' /var/saas/stats/usage_1499245200.json.2 ,因为 -n 这会抑制输出,如何我可以就地删除而不删除连续匹配并且只删除第一个匹配,我应该使用 -i 吗?
  • @sriram2207,如果你有gawk,那么你可以使用gawk -i inplace -v INPLACE_SUFFIX=.bak,否则awk '{ }' infile >tmpfile && mv tmpfile infile
  • @Jean-FrançoisFabre:谢谢 :)
  • @Jean-FrançoisFabre 请注意,在 awk 解决方案中,您只需指定终止条件 (/agents/) 一次,而在 sed 版本中,您必须指定两次?重复的代码是糟糕的代码。 awk 方法还有其他优点(例如效率和适应性) - 这是正确的解决方案,sed 用于s/old/new/
【解决方案2】:

当遇到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

【讨论】:

  • 非常感谢,而且每次,我都会阅读这个文件,我正在循环下执行一组操作,执行这些操作后,我会根据相同的模式匹配再次删除行,当我尝试使用: sed -n -e '/prefix/,/agents/d' -e '/agents/q' /var/saas/stats/usage_1499245200.json.2 ,这会因为 -n 而抑制输出,如何我可以就地删除而不删除连续匹配并且只删除第一个匹配,我应该使用 -i 吗?
  • -i 只覆盖当前文件。但这看起来是一个全新的问题。我建议您再问一个问题(这不是问题,您甚至可以将其链接到那个问题)
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2012-04-24
  • 2021-02-13
  • 2015-05-07
相关资源
最近更新 更多