2017-03-12 28 views
0

我很难让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 = .*\);.*/\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 

回答

1

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

然后,添加一个连字符,你可以把它当作表达式中的第一个或最后一个字符:

[a-zA-Z0-9_-] 

最后,范围像a-z并不一定意味着abcd...xyz,根据您所在地区。你可以使用一个POSIX字符类来代替:

[[:alnum:]_-] 

[:alnum:]对应于您所在区域的所有字母数字字符。在C区域设置中,它对应于0-9A-Za-z

+0

谢谢工作。谢谢。 – AlexL

0

你并不需要使用|符号的regex character class的字符分开。也许尝试这样的事情...

[a-zA-Z0-9\-_] 
0
$ 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 

[email protected] 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

相关问题