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

时间:2017-03-12 05:01:58

标签: regex sed character-class

我无法让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>

4 个答案:

答案 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

当配置设置带有下划线时也可以使用。