符合 posix 的函数,用于用参数和正则表达式替换文本

符合 posix 的函数,用于用参数和正则表达式替换文本

我正在创建一个函数,以安全的方式使用正则表达式替换字符串,不可能注入字符,并且不会放弃使用正则表达式:

#! /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 之外,它也不支持模式中的反向引用。

在这里,您可以坚持您的方法,但记录 / 需要转义的事实。无论如何,您都需要记录哪些是正则表达式运算符(因为用户可能需要转义它们),换行符无法匹配,并且换行符必须在替换以及 & 和反斜杠的特殊行为中转义。

相关内容