使用sed替换数字

时间:2012-09-30 14:25:13

标签: regex macos sed

我想使用找到的数字替换文件中的某些数字和计算结果,并且喜欢在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}'

(我确定原始行上没有~个令牌)

1 个答案:

答案 0 :(得分:8)

在“现代”正则表达式中,+具有特殊含义 - 它意味着“一个或多个”(就像*意味着“零或更多”) - 所以要匹配实际的加号,您需要使用\+。由于您显然不希望将sed - 脚本包装在引号中,因此您可以将其写为\\+

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正在将\1翻译为1

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/