【问题标题】:Regex works in grep, but not in sed正则表达式在 grep 中有效,但在 sed 中无效
【发布时间】:2017-01-31 08:26:02
【问题描述】:

我创建了以下正则表达式,我可以成功地使用它来获取子字符串,但不能用 sed 替换它。

test@devs-ops01:~$ grep -Eo "server\shost-gso121.*?:[0-9]{4}\s;" upstream_clusters.conf
server host-gso121.domain.com:8080 ;

当我尝试在 sed 中使用相同的正则表达式时,它没有捕捉到它:

test@devs-ops01:~$ sed 's/server\shost-gso121.*?:[0-9]{4}\s;//' upstream_clusters.conf
upstream service_cluster {


    server host-gso120.domain.com:8080 ;server host-gso121.domain.com:8080 ;

    keepalive 8;
}

然而,如果我只写服务器的名称而没有所有特殊功能,sed 命令会捕获它:

test@devs-ops01:~$ sed 's/host-gso121//' upstream_clusters.conf
upstream service_cluster {


    server host-gso120.domain.com:8080 ;server .domain.com:8080 ;

    keepalive 8;
}

任何建议都非常感谢!

【问题讨论】:

  • 尝试使用sed -E启用“扩展正则表达式”模式
  • 您在grep 中使用带有-E 的ERE(扩展正则表达式),但在sed 中没有。 (注意:OS X 在sed ERE 中似乎不支持*?,但在grep ERE 中支持。)
  • sed 不支持节俭的量词,即使是 -E/-r
  • 谢谢大家,我在 (GNU sed) 4.2.2 上的 ubuntu 中使用 -r 和 -E 都成功了
  • 另外,这与bash 无关。

标签: regex sed grep non-greedy


【解决方案1】:

@zeppelin 解决方案为我解决了这个问题。

sed -E

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多