使用 sed 替换数学表达式
Using sed to substitute mathematical expressions
我正在努力使用 sed 来替换数学表达式。对于即使正则表达式 \( \- xi\*\*2 \+ 2\*xi \- 1\)
matches the string "( - xi**2 + 2*xi - 1)" sed does not perform 替换:
echo "( - xi**2 + 2*xi - 1)" | sed -e 's/\( \- xi\*\*2 \+ 2\*xi \- 1\)/k1/g'
请指教
您在 regex101.com 处选择了 PCRE2 选项,而 sed
仅支持 POSIX 正则表达式风格。
在这里,您使用的是 POSIX BRE 风格,因此表达式看起来像
#!/bin/bash
s="( - xi**2 + 2*xi - 1)"
sed 's/( - xi\*\*2 + 2\*xi - 1)/k1/g' <<< "$s"
参见online demo。在 POSIX BRE 中,这个表达式的意思是:
(
- (
字符(未转义时,匹配 (
字符)
- xi
- 固定字符串
\*\*
- **
字符串(*
是 POSIX BRE 中的量词,表示 零个或多个 )
2 + 2
- 一个固定的 2 + 2
字符串,因为 +
只是 POSIX BRE 中的一个 +
字符
\*
- 一个 *
字符
xi - 1)
- 文字 xi - 1)
固定字符串,POSIX BRE 中的 )
匹配文字 )
字符。
如果您打算使用 POSIX ERE,您需要在正则表达式中转义 (
、)
和 +
:
sed -E 's/\( - xi\*\*2 \+ 2\*xi - 1\)/k1/g'
注意 -e
(表示接下来是要执行的命令的脚本)和 -E
(表示正则表达式风格是 POSIX ERE)之间的区别).
使用您展示的示例,请尝试在 sed
中进行以下操作。由于您正在进行模式匹配,那么恕我直言,我们可以匹配模式而不是进行替换,然后简单地打印新值(通过保持所有行的打印直到我们要求 sed
打印)。
s="( - xi**2 + 2*xi - 1)"
sed -n 's/( - xi\*\*2 + 2\*xi - 1)/k1/p' <<< "$s"
说明: 通过 sed
中的 -n
选项停止打印行,然后在主程序中使用正则表达式( - xi\*\*2 + 2\*xi - 1)
根据要求进行匹配,如果找到匹配,则在输出中打印 k1
。
使用sed
$ sed 's/( - \(xi\)\(\*\) + 2 - 1)/k1/' <(echo "( - xi**2 + 2*xi - 1)")
我正在努力使用 sed 来替换数学表达式。对于即使正则表达式 \( \- xi\*\*2 \+ 2\*xi \- 1\)
matches the string "( - xi**2 + 2*xi - 1)" sed does not perform 替换:
echo "( - xi**2 + 2*xi - 1)" | sed -e 's/\( \- xi\*\*2 \+ 2\*xi \- 1\)/k1/g'
请指教
您在 regex101.com 处选择了 PCRE2 选项,而 sed
仅支持 POSIX 正则表达式风格。
在这里,您使用的是 POSIX BRE 风格,因此表达式看起来像
#!/bin/bash
s="( - xi**2 + 2*xi - 1)"
sed 's/( - xi\*\*2 + 2\*xi - 1)/k1/g' <<< "$s"
参见online demo。在 POSIX BRE 中,这个表达式的意思是:
(
-(
字符(未转义时,匹配(
字符)- xi
- 固定字符串\*\*
-**
字符串(*
是 POSIX BRE 中的量词,表示 零个或多个 )2 + 2
- 一个固定的2 + 2
字符串,因为+
只是 POSIX BRE 中的一个 \*
- 一个*
字符xi - 1)
- 文字xi - 1)
固定字符串,POSIX BRE 中的)
匹配文字)
字符。
+
字符
如果您打算使用 POSIX ERE,您需要在正则表达式中转义 (
、)
和 +
:
sed -E 's/\( - xi\*\*2 \+ 2\*xi - 1\)/k1/g'
注意 -e
(表示接下来是要执行的命令的脚本)和 -E
(表示正则表达式风格是 POSIX ERE)之间的区别).
使用您展示的示例,请尝试在 sed
中进行以下操作。由于您正在进行模式匹配,那么恕我直言,我们可以匹配模式而不是进行替换,然后简单地打印新值(通过保持所有行的打印直到我们要求 sed
打印)。
s="( - xi**2 + 2*xi - 1)"
sed -n 's/( - xi\*\*2 + 2\*xi - 1)/k1/p' <<< "$s"
说明: 通过 sed
中的 -n
选项停止打印行,然后在主程序中使用正则表达式( - xi\*\*2 + 2\*xi - 1)
根据要求进行匹配,如果找到匹配,则在输出中打印 k1
。
使用sed
$ sed 's/( - \(xi\)\(\*\) + 2 - 1)/k1/' <(echo "( - xi**2 + 2*xi - 1)")