【问题标题】:Replacing by using sed wit regexp使用 sed 和正则表达式替换
【发布时间】:2014-08-11 15:24:29
【问题描述】:

需要用正则表达式替换文件中的字符串。 我的正则表达式是api.(dev[0-9]+\.)?side.com,我正在使用它来调用:

sed "s/api.(dev[0-9]+\.)?side.com/$SERVER_HOST_VALUE/g"

但它没有找到像“api.side.com”或“api.dev02.side.com”这样的字符串。正则表达式对我有用,而不仅仅适用于“sed”命令。

那么如何在sed 中正确使用当前的正则表达式?

【问题讨论】:

  • 使用sed -r,用于正则表达式扩展。否则,逃避一切:sed "s/api.\(dev[0-9]\+\.\)\?side.com/$SERVER_HOST_VALUE/g" file
  • 你说的我的正则表达式是api.(dev[0-9]+\.)?parkme.com是什么意思?
  • 如果正则表达式是api.(dev[0-9]+\.)?parkme.com,你为什么在命令中使用api.(dev[0-9]+\.)?side.comparkme != side.
  • @Barmar 对不起,我的错。已编辑
  • 请注意,正则表达式的方言很多,sed默认的正则表达式比其他大多数方言都简单。您需要了解您选择的工具支持的正则表达式,或者如何使您选择的工具使用您想要的正则表达式方言(如果这是一个选项)。

标签: regex bash sed


【解决方案1】:

根据@fedorqui 和@hwnd 的建议,使用-r option

sed -re "s/api.(dev[0-9]+\.)?side.com/$SERVER_HOST_VALUE/g"

注意:如果使用单引号而不是双引号,变量$SERVER_HOST_VALUE 将不会被扩展。

测试

SERVER_HOST_VALUE="AWESOME"
tests=( "api.side.com" "api.dev05.side.com" )
for t in "${tests[@]}"; do 
    echo "$t" | sed -re "s/api.(dev[0-9]+\.)?side.com/$SERVER_HOST_VALUE/g"
done

输出

注意匹配是如何被$SERVER_HOST_VALUE替换的:

AWESOME
AWESOME

【讨论】:

  • +1 链接,我不知道这个 explainshell 工具。另外,如果您在测试中指出输出,那将是很好的。
  • @Édouard Lopez -r 选项对我有帮助。谢谢!
  • @Édouard Lopez 非常感谢。
猜你喜欢
  • 2021-12-31
  • 2018-08-22
  • 2013-08-25
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多