我想删除两个字符串(包括两个字符串)之间的行,仅针对第一次出现的匹配,同一组字符串在文件中不断重复,我尝试使用下面的方法,但似乎不起作用:
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
使用分组命令和保持缓冲区的单一命令,但它将非常复杂,并且几乎不可能支持和修改。
如果你想尝试一下,看看本教程,但是当你进入高级部分时,你要做好头脑开始旋转的准备。