如何在Shell脚本中的两个字符串模式的后续出现之间替换字符串?
我有一个文件有几行,如:如何在Shell脚本中的两个字符串模式的后续出现之间替换字符串?,shell,sed,vi,Shell,Sed,Vi,我有一个文件有几行,如: "key1":"val1","key2":"val2","key3":"val3","key4":"val4" 在vi编辑器中或使用sed我想替换和之间的所有文本:“和”,“为”,“,即我想保留所有键并删除所有值 这条线将变成: "key1","key2","key3","key4" 在vi编辑器中,我尝试使用:%s/“:”*,“/”,“/g,并使用sed我使用sed的s/”:“*”,“/”,“/”,“/”,但不是替换中间文本,而是从第一次出现的“:“和最后一次出现
"key1":"val1","key2":"val2","key3":"val3","key4":"val4"
在vi
编辑器中或使用sed
我想替换和之间的所有文本:“
和”,“
为”,“
,即我想保留所有键并删除所有值
这条线将变成:
"key1","key2","key3","key4"
在vi
编辑器中,我尝试使用:%s/“:”*,“/”,“/g
,并使用sed
我使用sed的s/”:“*”,“/”,“/”,“/”
,但不是替换中间文本,而是从第一次出现的“:“
和最后一次出现的,“
”,即该行变为“key1”,“key4”:“val4”
如何替换后续出现的”:“
和后续出现的”,“
?假设键和值都不能包含”
,此sed解决方案将起作用:
sed 's/\("[^"]*"\):"[^"]*"/\1/g'
说明:
s/
替换
/\(“[^”]*”\):“[^”]*”/
搜索“stuff”:“more stuff”
,假设stuff
中没有其他双引号”
,等等,然后捕获第一部分(使用\(
和\)
)
/\1/
只保留第一部分
/g
并继续
*
是一个怪物,因为
匹配任何东西而*
贪婪。这应该会有帮助:您是否试图操纵JSON?比如?假设键不能包含:
,值不能包含”
::%s/:“[^”]*//g
或:%s/”:“[^”]*//g
Edit:如果键或值可以包含双引号“
”,那么只要您告诉我们如何转义“
,就可以很容易地修改此解决方案。(以及如何逃脱!)