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)
如前所述,您不需要任何东西来分隔括号表达式中的范围。所要做的就是添加|到表达式匹配的字符中。
然后,要添加连字符,您可以将其作为表达式中的第一个或最后一个字符:
[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。