【问题标题】:bash: sed regex ignoring stringbash:sed 正则表达式忽略字符串
【发布时间】:2014-08-07 15:57:02
【问题描述】:

我有两种可能的文本之一:

 myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)
 myProg v3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)

如何在我的 sed 正则表达式中忽略整个“FOO”字符串? 所以它会打印出来:

 v3.1.2.11.1+build4

我正在使用:

 sed -n '/myProg v/s/.*myProg v["FOO "]\([[:alnum:][:punct:]]*\).*/v\1/gp'

谢谢

【问题讨论】:

  • 您是否有理由要使用 sed?完全不需要 sed 的本机 bash 实现是否可以接受?
  • 我想我之前写过这段代码是为了支持我们拥有的旧 AIX 服务器。无法安装较新的 bash,也无法使用 grep -Po。 sed 是我发现的更好的选择。
  • 我也更喜欢在单行中作为管道操作
  • "In a single line" 使用=~ 很容易——我只是出于懒惰做了两个操作(在调用正则表达式之前统一案例,从而降低复杂性/测试要求相同的)。 “作为管道操作”——好吧,如果这适合你正在做的事情;请注意,它有性能成本。

标签: regex bash sed


【解决方案1】:

您犯了一个极为常见的错误,即使用方括号进行分组。他们不是那样做的。他们创建了一个角色类。您正在寻找常规圆括号(显然需要在您的 sed 方言中用反斜杠引用):

sed -n 's/.*myProg v\(FOO \)\?\([[:alnum:][:punct:]]*\).*/v\2/p'

您最初使用的/myProg v/ 虽然是出于好意,但并没有真正发挥作用;无论如何,上面的脚本只会打印替换成功的行。

(您拥有的 /g 标志根本没有用,因为在一行输入中只会有一个匹配项。)

这是假设您的 sed 接受 \? 表示“零次或一次重复”。如果不是这样,您可以使用* 通配符来代替,虽然有些不准确但安全。

【讨论】:

  • +1:解决问题的直接原因,并教授适用于 sed 之外的技能。 (我继续认为 sed 是适合这项工作的错误工具,但是...)
【解决方案2】:

您根本不需要sed ——而且当仅在单行上操作时,仅使用 bash 内置程序比运行外部程序并读取其输出要快得多。

s='myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)'
[[ $s = *" vFOO "* ]] && s=${s//vFOO /v}
[[ $s =~ (v[[:alnum:]][^[:space:]]+) ]] && echo "${BASH_REMATCH[1]}"

...发射...

v3.1.2.11.1+build4

【讨论】:

    【解决方案3】:

    grep 怎么样:

    grep -Po 'myProg v\D*\K[\d.]*'
    

    build... 信息:

    grep -Po 'myProg v\D*\K\S*' 
    

    用你的文字:

    kent$ echo "myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)
     myProg v3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)"|grep -Po 'myProg v\D*\K[\d.]*'
    3.1.2.11.1
    3.1.2.11.1
    
    kent$ echo "myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)
     myProg v3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)"|grep -Po 'myProg v\D*\K\S*'   
    3.1.2.11.1+build4
    3.1.2.11.1+build4
    

    【讨论】:

    • 假设 GNU grep?我的印象是,这在 Linux 之外仍然非常罕见——即使在最新的 OS X 上也不可用,f'rinstance。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2017-04-13
    • 1970-01-01
    • 2020-05-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多