![符合 posix 的函数,用于用参数和正则表达式替换文本](https://linux22.com/image/120139/%E7%AC%A6%E5%90%88%20posix%20%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%8C%E7%94%A8%E4%BA%8E%E7%94%A8%E5%8F%82%E6%95%B0%E5%92%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9B%BF%E6%8D%A2%E6%96%87%E6%9C%AC.png)
我正在创建一个函数,以安全的方式使用正则表达式替换字符串,不可能注入字符,并且不会放弃使用正则表达式:
#! /bin/sh
stringer()
{
pattern="${1}"
replace="${2}"
printf '%s\n' "examp/e w\\th sed: " | sed "s/${pattern}/${replace}/g"
}
stringer "\\/" "l"
到目前为止一切顺利,但如果我使用:
stringer "/" "l"
它将导致 sed 错误,关于这一点,我知道输入参数可以被转义,但是它不能与正则表达式一起使用,并且我希望能够与正则表达式一起使用它,任何有或没有的建议sed 但没有 posix 兼容方式的扩展?
答案1
只转义 / 是非常困难的,sed
因为例如它必须在以下情况下转义:
Foo/bar
Foo[XY]/
Foo\[/x\]
Foo\\/bar
但不是在
Foo [/x]bar
Foo [^]/x]bar
Foo [x[:blank:]/y]
Foo\/bar
可能更容易awk
使用
repl() {
PATTERN=$1 REPL=$2 awk '
{gsub(ENVIRON["PATTERN"], ENVIRON["REPL"]); print}'
}
但请注意,awk 的正则表达式是扩展正则表达式(与 sed 中的基本正则表达式相反),虽然它理解替换部分中的 & 表示匹配部分,但它不支持 sed 的\1
.除了 busybox awk 之外,它也不支持模式中的反向引用。
在这里,您可以坚持您的方法,但记录 / 需要转义的事实。无论如何,您都需要记录哪些是正则表达式运算符(因为用户可能需要转义它们),换行符无法匹配,并且换行符必须在替换以及 & 和反斜杠的特殊行为中转义。