String bash sed/awk/perl:删除一组字符,除非它与特定字符串匹配 目标是删除一组字母数字字符,包括 当它们出现在第二个冒号之前时,''.'和'-'除外 当该组与http[s]*匹配时。 第二个冒号也必须删除。 另一个限制是,如果第三个字段 第二个冒号后的冒号至少包含一个冒号。

String bash sed/awk/perl:删除一组字符,除非它与特定字符串匹配 目标是删除一组字母数字字符,包括 当它们出现在第二个冒号之前时,''.'和'-'除外 当该组与http[s]*匹配时。 第二个冒号也必须删除。 另一个限制是,如果第三个字段 第二个冒号后的冒号至少包含一个冒号。,string,sed,match,character,except,String,Sed,Match,Character,Except,例如,以下列表…: - name_1: name_11:value-1 name_2: value-2 name_3: http://value-3 - name_4: https://value-4 name_5: name_51:value-5 name_6: value-61:value-62:value-63 。。。必须转化为: - name_1: value-1 name_2: value-2 name_3: http://value-3 - name_4:

例如,以下列表…:

- name_1: name_11:value-1
  name_2: value-2
  name_3: http://value-3
- name_4: https://value-4
  name_5: name_51:value-5
  name_6: value-61:value-62:value-63
。。。必须转化为:

- name_1: value-1
  name_2: value-2
  name_3: http://value-3
- name_4: https://value-4
  name_5: value-5
  name_6: value-61:value-62:value-63
以下sed命令将删除所有第二个名称字段,包括它们与“http[s]*”匹配时的字段:

sed -E 's|([[:blank:]-]+[[:alnum:]_\.-]+:[[:blank:]]+)[[:alnum:]_\.-]+:([^:]+)$|\1\2|g' file
- name_1: value-1
  name_2: value-2
  name_3: //value-3
- name_4: //value-4
  name_5: value-5
  name_6: value-61:value-62:value-63
有什么建议吗?

使用另一种https?:|[:alnum:][u.-]+:捕获http:或https::

sed -E 's/([[:blank:]-]+[[:alnum:]_.-]+:[[:blank:]]+)((https?:)|[[:alnum:]_.-]+:)([^:]+)$/\1\3\4/g' file