我无法让sed识别其模式字符串中的连字符和下划线。
有谁知道为什么
[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
<body>
<div>
<label for="start">Start</label>
<input type="number" name="start">
</div>
<div>
<label for="end">End</label>
<input type="number" name="end">
</div>
<div>
<label for="step">Step</label>
<input type="number" name="step">
</div>
<p id="myP"></p>
答案 0 :(得分:1)
如上所述,您不需要在括号表达式中分隔范围。所有这一切都是将|
添加到表达式匹配的字符中。
然后,要添加连字符,您可以将其作为表达式中的第一个或最后一个字符:
[a-zA-Z0-9_-]
最后,a-z
等范围不一定代表abcd...xyz
,具体取决于您的区域设置。您可以改为使用POSIX字符类:
[[:alnum:]_-]
[:alnum:]
对应于您语言环境的所有字母数字字符。在C
语言环境中,它对应于0-9A-Za-z
。
答案 1 :(得分:0)
您无需在regex character class中使用|
符号来分隔字符。也许尝试这样的事情......
[a-zA-Z0-9\-_]
答案 2 :(得分: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
pknga_000@miro 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
答案 3 :(得分:0)
就我而言,我想替换包含连字符的配置设置。围绕.*
中的设置进行工作:
sed 's/.*some-service.*/some-service="new-value"/g' file
当配置设置带有下划线时也可以使用。