![在文件中查找子字符串](https://linux22.com/image/1008364/%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BE%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个包含如下文本的文件:
{姓名:“Jon”,孩子:[{i:1,n:“tyrell”},{i:2,n:“angela”},{i:3,n:“elliot”}]
我想要实现的是删除每个带有“:i”的字符串,所以在这种情况下它看起来像这样
{name: "Jon", 孩子: [{n: "tyrell"}, {n: "angela"}, {n: "elliot"}]
所以如果有“i:”,它应该删除所有内容(包括 i:)直到逗号“,”
我怎样才能实现这样的目标?
答案1
鉴于
$ cat file
{name: "Jon", kids: [{i: 1, n: "tyrell"}, {i: 2, n: "angela"}, {i: 3, n: "elliot"}]
然后
$ sed 's/i:[^,]*, //g' file
{name: "Jon", kids: [{n: "tyrell"}, {n: "angela"}, {n: "elliot"}]
添加-i
或--in-place
覆盖原始文件的内容
然而如果你的文件包含结构化数据,你应该使用正确的工具来完成这项工作 - 你的文件看起来几乎除了没有用引号括起来的键和缺少终止括号外,其他都与 JSON 类似:
$ jq -c --null-input '
{name: "Jon", kids: [{i: 1, n: "tyrell"}, {i: 2, n: "angela"}, {i: 3, n: "elliot"}]} |
del(.kids[].i)'
{"name":"Jon","kids":[{"n":"tyrell"},{"n":"angela"},{"n":"elliot"}]}
答案2
这个可以满足你的要求,
<<< '{name: "Jon", kids: [{i: 1, n: "tyrell"}, {i: 2, n: "angela"}, {i: 3, n: "elliot"}]' sed 's/i: .,//g'
这个做了你展示的事情(删除逗号后的空格),
<<< '{name: "Jon", kids: [{i: 1, n: "tyrell"}, {i: 2, n: "angela"}, {i: 3, n: "elliot"}]' sed 's/i: ., //g'
在实际情况下,您需要sed
使用输入文件运行
sed 's/i: ., //g' file.in
并可能重定向到输出文件
sed 's/i: ., //g' file.in > file.out