仅当它与 vi 编辑器中的字符串匹配时才查找和替换

Find and replace only if it matches a string in vi editor

我有一个大文件:

.
..
...
        {
        "term": "Allow A to B",
        "to_zone" : ["inside"],
        "from_zone" : ["sys"],
        "source" : ["10.10.10.10/32"],
        "destination": ["20.20.20.20/32","30.30.30.30/32"],
        "source_user" : ["any"],
        "category" : ["any"],
        "application" : ["any"],
        "service" : ["application-default"],
        "source_hip" : ["any"],
        "destination_hip" : ["any"],
        "tag" : ["con"],
        "action" : "allow",
        "rule_type" : ["universal"],
        "group_tag" : ["con"],
        "profile_setting" : "alert-only"
        },
...
..
.

我只想删除方括号 '[]' 并仅在匹配 'group_tag'.

行时保留引号

预期结果为:

.
..
...
        {
        "term": "Allow A to B",
        "to_zone" : ["inside"],
        "from_zone" : ["bdd"],
        "source" : ["10.10.10.10/32"],
        "destination": ["20.20.20.20/32","30.30.30.30/32"],
        "source_user" : ["any"],
        "category" : ["any"],
        "application" : ["any"],
        "service" : ["application-default"],
        "source_hip" : ["any"],
        "destination_hip" : ["any"],
        "tag" : ["con"],
        "action" : "allow",
        "rule_type" : ["universal"],
        "group_tag" : "con",
        "profile_setting" : "alert-only"
        },
...
..
.

如何在 vi 编辑器中完成此操作?

您可以对匹配模式的行应用替换:

:/group_tag/s/[\[\]]//g

[\[\]] 匹配文字左方括号或右方括号。

要一次获得所有这些行,我认为您必须使用这种方法:

:%s/\(^.*group_tag" : \)\[\(.*\)\]\(.*\)//g

这是匹配整行,但要记住(使用捕获组:\(\)) 除方括号外的所有内容。然后我们用 只有记住的捕获组。

但也请参阅 this 中的方法 问题.