sed 在模式之间就地删除仅第一个匹配

sed 在模式之间就地删除仅第一个匹配

我想删除两个字符串(包括两个字符串)之间的行,仅针对第一次出现的匹配,同一组字符串在文件中不断重复,我尝试使用下面的方法,但似乎不起作用:

sed -n -e '/prefix/,/agents/d' -e '/agents/$q' /var/saas/stats/usage_1499245200.json.2

另外,想要就地删除第一次出现的内容而不是重定向到标准输出,因此使用-i

我的文件的前 30 行如下所示:

 },{
   "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,

问候,Sriram.V

答案1

这似乎是一个非常困难的问题,因为要求只删除第一个实例。

例如删除每一个实例:

sed '/prefix/,/agents/d' /var/saas/stats/usage_1499245200.json.2

这只会删除第一个实例,但留下第一行和最后一行:

sed -n -e '1,/prefix/p' -e'/agents/,$p' /var/saas/stats/usage_1499245200.json.2

我尝试过用一个sed命令删除它们,但没有成功。我最好的办法是将它们拆分成两个文件,然后将它们合并:

sed -n '1,/prefix/p' </var/saas/stats/usage_1499245200.json.2|head -n -1 >head.tmp
sed -n '/agents/,$p' </var/saas/stats/usage_1499245200.json.2|tail -n +2 >tail.tmp
cat head.tmp tail.tmp >/var/saas/stats/usage_1499245200.json.2
rm head.tmp tail.tmp

(您不需要两个单独的文件,但使用它们会更容易理解。)

可能存在sed使用分组命令和保持缓冲区的单一命令,但它将非常复杂,并且几乎不可能支持和修改。

如果你想尝试一下,看看本教程,但是当你进入高级部分时,你要做好头脑开始旋转的准备。

相关内容