5

我想用找到的数字计算的结果替换文件中的一些数字,并且想在 MacOSX 上使用 sed。我尝试了很多变体,现在知道我必须使用 -E 来使用现代而不是基本的正则表达式。

一些例子:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed s/\ +\ wwv_flow_id.offset/blabla/

bla 18934750blabla bla

因此,如果没有 -E,它会查找并替换固定文本。但是使用 -E,它不会:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ +\ wwv_flow_id.offset/blabla/

bla 18934750 + wwv_flow_id.offset bla

换句话说:没有匹配,文本没有变化。最终目标是找到固定文本“+ wwv_flow_id.offset”之前的数字并使用该数字并从中减去一个固定数字(例如750),因此最终结果变为:

bla 18934000 + wwv_flow_id.offset bla

为此,我至少需要反向引用,这也不能像我预期的那样工作,因为

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\1/

bla 1+ wwv_flow_id.offset bla

我希望一些正则表达式大师可以在这里帮助我。


更新

在 ruakh 的帮助下,这就是我现在所拥有的:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) \+ wwv_flow_id.offset/(\1-750) \+ wwv_flow_id.offset/'

返回:

bla (18934750-750) + wwv_flow_id.offset bla

现在的奖金问题是,如何把它变成

bla 18934000 + wwv_flow_id.offset bla




更新 2

通过将 sed 与 awk 结合起来,我设法达到了我想要的结果,如下所示:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+)([ ]*)\+([ ]*)wwv_flow_id.offset/~\1~\2\+\3wwv_flow_id.offset/' | awk -F~ '{print $1 $2-750 $3}'

(我确定~原始行上没有标记)

4

1 回答 1

8

在“现代”正则表达式中,+有一个特殊的含义——它的意思是“一个或多个”(就像*“零或多个”的意思一样)——所以要匹配一个实际的加号,你需要使用\+. 由于您显然不希望将sed-script 用引号括起来,因此您可以将其写为\\+

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ \\+\ wwv_flow_id.offset/blabla/

虽然我认为如果你放弃这种偏好,它会让你的生活更轻松,并写下:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/ \+ wwv_flow_id.offset/blabla/'

引用您的论点还将解决您的反向引用问题,即 Bash 正在转换\11

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) /\1/'

但是,如果您仍然喜欢坚持使用未引用的脚本sed样式,则可以编写\\1

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\\1/
于 2012-09-30T14:39:55.120 回答