Emm*_*own 6 shell-script posix regular-expression replace
我正在创建一个函数,以安全的方式使用正则表达式替换字符串,不可能注入字符,也不会放弃使用正则表达式:
#! /bin/sh
stringer()
{
pattern="${1}"
replace="${2}"
printf '%s\n' "examp/e w\\th sed: " | sed "s/${pattern}/${replace}/g"
}
stringer "\\/" "l"
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但如果我使用:
stringer "/" "l"
Run Code Online (Sandbox Code Playgroud)
它会导致一个 sed 错误,关于这个我知道输入参数可以被转义,但是它不能与正则表达式一起使用,我希望能够将它与正则表达式一起使用,有或没有任何建议sed 但没有符合 posix 方式的扩展?
转义 / only 是非常困难的,sed因为例如它必须被转义为:
Foo/bar
Foo[XY]/
Foo\[/x\]
Foo\\/bar
Run Code Online (Sandbox Code Playgroud)
但不是在
Foo [/x]bar
Foo [^]/x]bar
Foo [x[:blank:]/y]
Foo\/bar
Run Code Online (Sandbox Code Playgroud)
这可能是更容易使用awk,而不是
repl() {
PATTERN=$1 REPL=$2 awk '
{gsub(ENVIRON["PATTERN"], ENVIRON["REPL"]); print}'
}
Run Code Online (Sandbox Code Playgroud)
但是请注意,awk 的正则表达式是扩展的正则表达式(与 sed 中的基本正则表达式相反),虽然它在替换部分中将 & 理解为匹配的部分,但它不支持 sed 的\1。除了busybox awk,它也不支持模式中的反向引用。
在这里,您可以坚持使用您的方法,但要记录 / 需要转义的事实。无论如何,您都需要记录哪些是正则表达式运算符(因为用户可能需要对它们进行转义),无法匹配换行符,并且必须在替换中转义该换行符以及 & 和反斜杠的特殊行为。
| 归档时间: |
|
| 查看次数: |
1664 次 |
| 最近记录: |