我想使用找到的数字替换文件中的某些数字和计算结果,并喜欢在MacOSX上使用sed.我尝试了很多变种,现在知道我必须使用-E来使用现代而不是基本的正则表达式.
一些例子:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed s/\ +\ wwv_flow_id.offset/blabla/
Run Code Online (Sandbox Code Playgroud)
给
bla 18934750blabla bla
Run Code Online (Sandbox Code Playgroud)
因此,如果没有-E,它会找到并替换固定文本.但是使用-E,它不会:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ +\ wwv_flow_id.offset/blabla/
Run Code Online (Sandbox Code Playgroud)
给
bla 18934750 + wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)
换句话说:文本中没有匹配也没有变化.最终目标是找到固定文本"+ wwv_flow_id.offset"之前的数字并使用该数字并从中减去固定数字(比如750),因此最终结果变为:
bla 18934000 + wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)
为此,我至少需要返回引用,这也不像我预期的那样工作,因为
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\1/
Run Code Online (Sandbox Code Playgroud)
给
bla 1+ wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)
我希望一些正则表达的大师可以帮助我.
UPDATE
在ruakh的帮助下,这就是我现在所拥有的:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) \+ wwv_flow_id.offset/(\1-750) \+ wwv_flow_id.offset/'
Run Code Online (Sandbox Code Playgroud)
返回:
bla (18934750-750) + wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)
现在的奖金问题是,如何将其转化为
bla 18934000 + wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)
更新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}'
Run Code Online (Sandbox Code Playgroud)
(我确定~原始线上没有令牌)
在"现代"正则表达式中,+具有特殊含义 - 它意味着"一个或多个"(就像*"零或更多"的意思) - 所以为了匹配实际的加号,你需要使用\+.由于您显然不希望将sed-script 包装在引号中,因此您可以将其写为\\+:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ \\+\ wwv_flow_id.offset/blabla/
Run Code Online (Sandbox Code Playgroud)
虽然我认为如果放弃这种偏好会让你的生活更轻松,并写道:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/ \+ wwv_flow_id.offset/blabla/'
Run Code Online (Sandbox Code Playgroud)
引用你的论点也将解决你的反向引用问题,Bash正在将其转换\1为1:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) /\1/'
Run Code Online (Sandbox Code Playgroud)
虽然如果你仍然喜欢坚持你的非引用sed样式,你可以写\\1:
echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\\1/
Run Code Online (Sandbox Code Playgroud)