sed - 使用数组构建正则表达式

sed - using array to build regex

我在从字符串数组构造正则表达式以用于 sed 命令时遇到问题。

这是一个例子

#!/usr/bin/env bash

function join { local IFS=""; shift; echo "$*"; }

array=("foo" "bar" "baz")
regex=$(join "\|" "${array[@]}") # foo|bar|baz

echo "foo bar baz" | sed "s/${regex}/replaced/g"

我期待它输出 replaced replaced replaced,但它返回 foo bar baz 因为这个正则表达式没有命中任何东西。正则表达式中的管道在这里没有被正确转义。

我做错了什么?

| 需要在基本正则表达式语法中转义。要么使用扩展语法:

sed -r "s/${regex}/replaced/g"          # GNU sed. With BSD sed, use -E

或者构建正则表达式,使其成为 foo\|bar\|baz

您需要使用:

regex=$(join '|' "${array[@]}")

因为 IFS 只接受一个字符。

然后使用(对于 BSD):

echo "foo bar baz" | sed -E "s/${regex}/replaced/g"

或 Linux:

echo "foo bar baz" | sed -r "s/${regex}/replaced/g"

编辑: 如果你想避免在 sed 中使用扩展正则表达式选项,那么重构你的 join 函数,如下所示:

join() { sep=""; shift; echo -n ""; shift; printf "$sep%s" "$@"; }

然后将其用作:

regex=$(join '\|' "${array[@]}")
echo "foo bar baz" | sed "s/${regex}/replaced/g"
replaced replaced replaced