【发布时间】: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 你是对的,但管道仍然比空格好:)(昨天在帖子中看到)