在文件中查找子字符串

在文件中查找子字符串

我有一个包含如下文本的文件:

{姓名:“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

相关内容