【问题标题】:Using sed with a regex to replace strings使用带有正则表达式的 sed 替换字符串
【发布时间】:2019-10-10 13:16:19
【问题描述】:

我想用另一个单词替换一些包含特定单词的字符串。

这是我的代码

#!/bin/bash
arr='foo/foo/baz foo/bar/baz foo/baz/baz';

for i in ${arr[@]}; do
  echo $i | sed -e 's|foo/(bar\|baz)/baz|test|g'
done

结果

foo/foo/baz
foo/bar/baz
foo/baz/baz

预期

foo/foo/baz
foo/test/baz
foo/test/baz

【问题讨论】:

  • 转义括号或添加 -E 标志。顺便说一句,管道作为分隔符不是一个好主意
  • 谢谢,这是 -E 标志。为什么管道不好?
  • 你没有创建一个数组,顺便说一句,它只是感觉像一个,因为你没有引用${arr[@]}。您必须使用arr=('foo/foo/baz' 'foo/bar/baz' 'foo/baz/baz') 来获取数组,然后使用for i in "${arr[@]}"。管道不是一个好主意,因为我认为它也是一个正则表达式特殊字符。
  • @higoka 因为管道在正则表达式语言本身中具有含义。好的替代分隔符是没有意义的字符,例如~#
  • PS:@oguzismail 你是对的,但管道仍然比空格好:)(昨天在帖子中看到)

标签: bash sed terminal


【解决方案1】:

有几件事可以改进。您将备用分隔符 '|' 用于 sed 替换表达式的原因(为了避免 \/\/\/ 的“栅栏”外观使使用 '|' 作为 OR(替代)正则表达式组件变得复杂。选择替代不作为正则表达式的一部分的分隔符,'#' 工作正常。

接下来没有理由循环,只需使用here字符串arr的内容重定向到sed并将其全部放入命令替换使用 "%s\n" 格式说明符提供换行符分隔的输出。 (那是拗口,其实也不过如此)

arr='foo/foo/baz foo/bar/baz foo/baz/baz'
printf "%s\n" $(sed 's#/\(bar\|baz\)/#/test/#g' <<< $arr))

使用/输出示例

要测试它,只需选择上面的表达式,然后用鼠标中键将选择粘贴到终端中,例如

$ arr='foo/foo/baz foo/bar/baz foo/baz/baz'
> printf "%s\n" $(sed 's#/\(bar\|baz\)/#/test/#g' <<< $arr)
foo/foo/baz
foo/test/baz
foo/test/baz

检查一下,如果您还有其他问题,请告诉我。

【讨论】:

    【解决方案2】:

    这样的事情怎么样:

    sed -e 's/\(bar\|baz\)\//test\//g'
    

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2013-02-21
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多