【问题标题】:Sed replacement on bashbash 上的 sed 替换
【发布时间】:2015-08-22 18:34:31
【问题描述】:

我有以下字符串

<dataSource jndiName="worklightconsole/jdbc/WorklightDS" transactional="false">

我想用“app”替换“worklightconsole”这个词,以便输出如下所示

<dataSource jndiName="app/jdbc/WorklightDS" transactional="false">

我使用“sed”尝试了以下(以及其他几个选项),但无法使其工作

sed -e 's/\<dataSource\ jndiName=\".*\//\dataSource\ jndiName=\"app\//g'

我得到了输出

<dataSource jndiName="app/WorklightDS" transactional="false">

它没有替换单词“worklightconsole”,而是用“app”替换了“worklightconsole/jdbc”

我做错了什么以及 sed 中的 '.*' 是什么意思?

【问题讨论】:

  • 我认为你可以使用s/jndiName=\"[^\"\/]+/jndiName=\"app/g ;)。

标签: regex bash sed


【解决方案1】:

使用 GNU sed:

sed -E 's|(jndiName=")[^/]*(/jdbc/WorklightDS")|\1app\2|' file

替换“就地”:

sed -E -i 's|(jndiName=")[^/]*(/jdbc/WorklightDS")|\1app\2|' file

.: 匹配任意字符一次

.*:匹配任意字符零次或多次

【讨论】:

  • 它就像一个魅力。但是,你能解释一下这种模式是如何工作的吗?尤其是我很想知道什么是 '\1app\2'?
  • \1 指第一对圆括号jndiName=" 中的表达式,\2 指第二对圆括号/jdbc/WorklightDS" 中的表达式。使用\1app\2,结果为jndiName="app/jdbc/WorklightDS"
  • 很好的解释,谢谢
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 2011-12-02
  • 2021-11-20
  • 1970-01-01
  • 2020-02-03
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多