使用 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)")