【发布时间】:2012-09-21 15:12:43
【问题描述】:
我想用找到的数字计算的结果替换文件中的一些数字,并且想在 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}'
(我确定原行中没有~ 标记)
【问题讨论】:
-
请注意,扩展正则表达式使用
()进行分组,而不是\(\)。请记住引用您的 sed 脚本以保护它免受 shell 扩展。awk在这里会更容易使用。 -
Rob,我不认为 sed 是这里的最佳选择。您想匹配某些模式并对某些字段进行算术运算。为此,可以使用 awk 和 perl 等更好的工具。如果文件有一些固定的格式,它会很有帮助。
-
感谢 ruakh、ik_zelf 和 Chuck Kollars 的所有帮助。我也使用 awk 发布了最终结果的第二次更新。可能会有更简单的解决方案,但我对这个很满意。