连字符和下划线在 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
当配置设置有下划线时也有效。