连字符和下划线在 sed 中不兼容

Hyphen and underscore not compatible in sed

我无法让 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 = .*\);.*/    /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 = .*\);.*/    /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 = .*\);.*/    /g' /tmp/sed_undescore_hypen
lkjdaslf lkjlsadjfl dfpasdiuy service-type = service-1; jaldkfjlasdjflk address = address1; kldjfladsf
service-type = service_1    address = address1

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

[a-zA-Z0-9\-_]
$ sed 's/.*\(service-type = [a-z|A-Z|0-9|_-]*\);.*\(address = .*\);.*/    /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 = .*\);.*/    /g' sed_underscore_hypen.txt
service-type = service-1    address = address1
service-type = service_1    address = address1

要匹配字符class中的连字符,不能放在两个字符之间,否则会被解释为范围运算符。因此,要匹配连字符,请将其放在字符 class 的开头或结尾:并且不需要转义。请参阅此答案以获取解释:

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

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

[a-zA-Z0-9_-]

最后,a-z 等范围不一定表示 abcd...xyz,具体取决于您所在的区域设置。您可以使用 POSIX 字符 class 代替:

[[:alnum:]_-]

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

就我而言,我想替换包含连字符的配置设置。 .* 周围的设置有效:

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

当配置设置有下划线时也有效。