【问题标题】:can't grock simple sed backreference不能简单的 sed 反向引用
【发布时间】:2013-11-21 19:10:44
【问题描述】:

我正在尝试使用 sed 来使用反向引用作为替代。

echo MXN-PKG-0.3.6-62.noarch.rpm | sed -E 's/(\d\.\d\.\d+)/\1/'

在我熟悉的 preg_match 上测试了正则表达式,它看起来很可靠

php > $str = 'MXN-PKG-0.3.6-62.noarch.rpm';
php > preg_match('/(\d\.\d\.\d+)/', $str, $matches);
php > var_dump($matches);
array(2) {
  [0]=>
  string(5) "0.3.6"
  [1]=>
  string(5) "0.3.6"
}

sed 哪里出错了?我正在使用扩展的正则表达式,并查看了许多显示使用\1 捕获第一个反向引用的示例。

【问题讨论】:

    标签: php regex bash sed


    【解决方案1】:

    sed 的正则表达式引擎 (ERE) 不支持 \d 用于数字

    使用这个 sed:

    echo MXN-PKG-0.3.6-62.noarch.rpm | sed -E 's/([0-9]\.[0-9]\.[0-9]+)/[\1]/'
    MXN-PKG-[0.3.6]-62.noarch.rpm
    

    在 Linux 上:

    echo MXN-PKG-0.3.6-62.noarch.rpm | sed -r 's/([0-9]\.[0-9]\.[0-9]+)/[\1]/'
    MXN-PKG-[0.3.6]-62.noarch.rpm
    

    【讨论】:

    • 有趣的是,我认为这将与扩展的正则表达式一起出现。谢谢。现在我想起来了,我可能把 PCRE 和 ERE 混淆了。
    • 是的,没错,除了grep -P(即PCRE)之外,其他常规的Unix工具都不支持\d
    • 您的示例仍然在 Linux 和 OSX 上为我吐出完整的输入字符串。 (Linux 是我所关心的)。
    • 添加了 OSX 和 Linux 示例及其输出。 (方括号仅用于显示此示例)
    • 很好,我意识到在您更新后我需要额外的反向引用才能在输出中只获得我正在寻找的部分。这就是我选择的sed -r 's/(.*:?)([0-9]\.[0-9]\.[0-9]+)(.*)/\2/'。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2021-02-05
    • 2013-02-17
    相关资源
    最近更新 更多