如何在 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 个字符串模式之间替换一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章