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

tec*_*e11 5 regex sed character-class

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

有谁知道为什么

[a-z|A-Z|0-9|\-|_]
Run Code Online (Sandbox Code Playgroud)

在以下示例中的工作方式如下

[a-z|A-Z|0-9|_]
Run Code Online (Sandbox Code Playgroud)

?

$  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
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 9

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

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

[a-zA-Z0-9_-]
Run Code Online (Sandbox Code Playgroud)

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

[[:alnum:]_-]
Run Code Online (Sandbox Code Playgroud)

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