如何在 Shell 脚本中随后出现的 2 个字符串模式之间替换一个字符串?

Posted

技术标签:

【中文标题】如何在 Shell 脚本中随后出现的 2 个字符串模式之间替换一个字符串?【英文标题】:How to replace a string between subsequent occurrence of 2 string pattern in Shell scripting? 【发布时间】:2020-04-04 23:32:38 【问题描述】:

我有一个包含几行的文件,例如:

"key1":"val1","key2":"val2","key3":"val3","key4":"val4"

vi 编辑器或使用sed 我想用"," 替换":""," 之间的所有文本,即我想保留所有键并删除所有值。

这条线会变成这样:

"key1","key2","key3","key4"

vi 编辑器中,我尝试使用:%s/":".*","/","/g,并使用sed 我使用sed 's/":"*","/","/',但不是替换中间文本,而是删除第一次出现":" 的所有文本最后一次出现",",即这条线正在变成"key1","key4":"val4"

如何替换随后出现的 ":" 和后面的 "," 之间的文本?

【问题讨论】:

.* 是一个怪物,因为. 匹配任何东西,而* 是贪婪的。这应该会有所帮助:***.com/questions/1305853/… 您是否在尝试操纵 JSON?喜欢this? 假设键不能包含:,值不能包含":%s/:"[^"]*"//g:%s/":"[^"]*//g 【参考方案1】:

假设 key 和 value 都不能包含 ",这个 sed 解决方案将起作用:

   sed 's/\("[^"]*"\):"[^"]*"/\1/g'

解释:

s/替代 /\("[^"]*"\):"[^"]*"/搜索"stuff":"more stuff",这里假设stuff中没有其他双引号"等,然后捕获第一部分(有\(\)/\1/只保留第一部分 /g 并继续

【讨论】:

编辑:如果键或值可以包含双引号",一旦您告诉我们,此解决方案可能很容易修改" 是如何转义的。 (以及如何逃脱!)

以上是关于如何在 Shell 脚本中随后出现的 2 个字符串模式之间替换一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

往shell脚本中传入参数

求帮写个简单的shell脚本文件,在线等

shell脚本中如何输出标准错误和标准输出

SHELL脚本--shell数组基础

shell脚本进阶之数组基础

如何在 shell 脚本中使用正则表达式?