我想用另一个单词替换一些包含特定单词的字符串。
这是我的代码
#!/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
答案 0 :(得分:0)
怎么样呢?
sed -e 's/\(bar\|baz\)\//test\//g'
答案 1 :(得分:0)
您可以改进几件事。您为'|'
替换表达式使用备用定界符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
仔细检查一下,如果还有其他问题,请告诉我。