如何在 Shell 脚本中随后出现的 2 个字符串模式之间替换字符串?
How to replace a string between subsequent occurrence of 2 string pattern in Shell scripting?
我有一个包含几行的文件,例如:
"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/\("[^"]*"\):"[^"]*"//g'
解释:
s/
替换
/\("[^"]*"\):"[^"]*"/
搜索"stuff":"more stuff"
,这里假定stuff
中没有其他双引号"
等,然后抓取第一部分(\(
和 \)
)
//
只保留第一部分
/g
并继续
我有一个包含几行的文件,例如:
"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/\("[^"]*"\):"[^"]*"//g'
解释:
s/
替换/\("[^"]*"\):"[^"]*"/
搜索"stuff":"more stuff"
,这里假定stuff
中没有其他双引号"
等,然后抓取第一部分(\(
和\)
)//
只保留第一部分/g
并继续