【问题标题】:Hyphen and underscore not compatible in sed连字符和下划线在 sed 中不兼容
【发布时间】:2017-08-02 07:23:44
【问题描述】:

我无法让 sed 识别其模式字符串中的连字符和下划线。

有谁知道原因

[a-z|A-Z|0-9|\-|_]

在下面的例子中像

[a-z|A-Z|0-9|_]

?

$  cat /tmp/sed_undescore_hypen
lkjdaslf lkjlsadjfl dfpasdiuy service-type = service-1; jaldkfjlasdjflk address = address1; kldjfladsf
lkjdaslf lkjlsadjfl dfasdf  service-type = service_1; jaldkfjlasdjflk address = address1; kldjfladsf

$  sed 's/.*\(service-type = [a-z|A-Z|0-9|\-|_]*\);.*\(address = .*\);.*/\1    \2/g' /tmp/sed_undescore_hypen
lkjdaslf lkjlsadjfl dfpasdiuy service-type = service-1; jaldkfjlasdjflk address = address1; kldjfladsf
service-type = service_1    address = address1

$  sed 's/.*\(service-type = [a-z|A-Z|0-9|\-]*\);.*\(address = .*\);.*/\1    \2/g' /tmp/sed_undescore_hypen
service-type = service-1    address = address1
lkjdaslf lkjlsadjfl dfasdf  service-type = service_1; jaldkfjlasdjflk address = address1; kldjfladsf

$  sed 's/.*\(service-type = [a-z|A-Z|0-9|_]*\);.*\(address = .*\);.*/\1    \2/g' /tmp/sed_undescore_hypen
lkjdaslf lkjlsadjfl dfpasdiuy service-type = service-1; jaldkfjlasdjflk address = address1; kldjfladsf
service-type = service_1    address = address1

【问题讨论】:

    标签: regex sed character-class


    【解决方案1】:

    如前所述,您不需要任何东西来分隔括号表达式中的范围。所要做的就是将| 添加到表达式匹配的字符中。

    然后,要添加连字符,您可以将其作为表达式中的第一个或最后一个字符:

    [a-zA-Z0-9_-]
    

    最后,像a-z 这样的范围不一定意味着abcd...xyz,具体取决于您的语言环境。您可以改用 POSIX 字符类:

    [[:alnum:]_-]
    

    其中[:alnum:] 对应于您所在地区的所有字母数字字符。在C 语言环境中,它对应于0-9A-Za-z

    【讨论】:

    • 连字符最后!啊哈。
    【解决方案2】:

    您无需在regex character class 中使用| 符号来分隔字符。也许尝试这样的事情......

    [a-zA-Z0-9\-_]
    

    【讨论】:

      【解决方案3】:
      $ sed 's/.*\(service-type = [a-z|A-Z|0-9|_-]*\);.*\(address = .*\);.*/\1    \2/g' sed_underscore_hypen.txt
      service-type = service-1    address = address1
      service-type = service_1    address = address1
      
      pknga_000@miro MINGW64 ~/Documents
      $ sed 's/.*\(service-type = [-a-z|A-Z|0-9|_]*\);.*\(address = .*\);.*/\1    \2/g' sed_underscore_hypen.txt
      service-type = service-1    address = address1
      service-type = service_1    address = address1
      

      要匹配字符类中的连字符,它不能放在两个字符之间,否则将被解释为范围运算符。因此,要匹配连字符,请将其放在字符类的开头或结尾:并且不需要转义。请参阅此答案以获得解释:https://stackoverflow.com/a/4068725

      【讨论】:

        【解决方案4】:

        就我而言,我想替换包含连字符的配置设置。围绕.* 中的设置工作:

        sed 's/.*some-service.*/some-service="new-value"/g' file
        

        当配置设置有下划线时也可以使用。

        【讨论】:

          猜你喜欢
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多