如何在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:如果键或值可以包含双引号
    ”,那么只要您告诉我们如何转义
    ,就可以很容易地修改此解决方案。(以及如何逃脱!)