【问题标题】:bash sed/awk/perl: removing a group of characters except when it matches specific stringsbash sed/awk/perl:删除一组字符,除非它匹配特定的字符串
【发布时间】:2020-04-04 01:08:57
【问题描述】:
  • 目标是删除一组字母数字字符(包括 '_', '.'和 '-') 当它们出现在第二个冒号 (:) 之前时,除了 当该组匹配 http[s]*.
  • 还必须删除第二个冒号。
  • 另一个限制是,如果第三个字段没有任何动作 (第二个冒号之后的那个)至少包含一个冒号。

例如,以下列表...:

- 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

有什么建议吗?

【问题讨论】:

    标签: string sed match character except


    【解决方案1】:

    使用捕获http:https: 的替代((https?:)|[[:alnum:]_.-]+:)

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

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      相关资源
      最近更新 更多