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
我在从字符串数组构造正则表达式以用于 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