我经常从 Mathematica 中取出太长而无法阅读的长方程,并将它们放入 C 中。Mathematica 放入了很多我想删除的换行符,以便它很好地适合 80 个字符的行块。
例如:
(sin(T)*(16*pow(a,2)*M*cos(T)*pow(r,5)*
pow(Th_d,2) -
8*pow(a,2)*cos(T)*pow(r,6)*pow(Th_d,2) +
M*pow(r,3)*(-((3*pow(a,2)*pow(Ee,2) - 8*pow(Jz,2) -
4*pow(a,2)*pow(Ee,2)*cos(2*T) +
pow(a,2)*pow(Ee,2)*cos(4*T))*Cot(T)*pow(csc(T),3))/
2. + 32*pow(a,4)*pow(cos(T),3)*pow(Th_d,2)) -
2*(pow(a,4)*pow(Jz,2)*cos(T)*pow(Cot(T),4) +
4*pow(a,6)*pow(cos(T),5)*pow(r_d,2) +
4*pow(a,8)*pow(cos(T),5)*pow(Th_d,2)) -
2*pow(r,4)*(pow(Jz,2)*Cot(T)*pow(csc(T),3) +
4*pow(a,2)*cos(T)*pow(r_d,2) +
2*pow(a,4)*(5*cos(T) + cos(3*T))*pow(Th_d,2))\
+ (pow(a,2)*M*Cot(T)*pow(csc(T),3)*r*
(4*(pow(a,2)*pow(Ee,2) - 2*a*Ee*Jz + 2*pow(Jz,2))*cos(2*T) -
a*Ee*(a*Ee - 2*Jz)*(3 + cos(4*T)) +
2*pow(a,4)*pow(sin(2*T),4)*pow(Th_d,2)))/2. +
pow(r,2)*(-16*pow(a,4)*pow(cos(T),3)*
pow(r_d,2) -
4*pow(a,2)*pow(Cot(T),3)*csc(T)*
(pow(Jz,2) + pow(a,4)*(5 + cos(2*T))*pow(sin(T),4)*
pow(Th_d,2)))))/
(4.*pow(pow(a,2)*pow(cos(T),2) + pow(r,2),2)*
(pow(a,2) - 2*M*r + pow(r,2)))
会成为
(sin(T)*(16*pow(a,2)*M*cos(T)*pow(r,5)*pow(Th_d,2) - 8*pow(a,2)*cos(T)*
pow(r,6)*pow(Th_d,2) + M*pow(r,3)*(-((3*pow(a,2)*pow(Ee,2) - 8*pow(Jz,2) -
4*pow(a,2)*pow(Ee,2)*cos(2*T) + pow(a,2)*pow(Ee,2)*cos(4*T))*Cot(T)*pow(csc(T),3))/
2. + 32*pow(a,4)*pow(cos(T),3)*pow(Th_d,2)) - 2*(pow(a,4)*pow(Jz,2)*cos(T)*
pow(Cot(T),4) + 4*pow(a,6)*pow(cos(T),5)*pow(r_d,2) + 4*pow(a,8)*pow(cos(T),5)*
pow(Th_d,2)) - 2*pow(r,4)*(pow(Jz,2)*Cot(T)*pow(csc(T),3) + 4*pow(a,2)*cos(T)*
pow(r_d,2) + 2*pow(a,4)*(5*cos(T) + cos(3*T))*pow(Th_d,2)) + (pow(a,2)*M*Cot(T)*
pow(csc(T),3)*r*(4*(pow(a,2)*pow(Ee,2) - 2*a*Ee*Jz + 2*pow(Jz,2))*cos(2*T) -
a*Ee*(a*Ee - 2*Jz)*(3 + cos(4*T)) + 2*pow(a,4)*pow(sin(2*T),4)*pow(Th_d,2)))/2. +
pow(r,2)*(-16*pow(a,4)*pow(cos(T),3)*pow(r_d,2) - 4*pow(a,2)*pow(Cot(T),3)*csc(T)*
(pow(Jz,2) + pow(a,4)*(5 + cos(2*T))*pow(sin(T),4)*pow(Th_d,2)))))/(4.*pow(pow(a,2)*
pow(cos(T),2) + pow(r,2),2)*(pow(a,2) - 2*M*r + pow(r,2)));
这不是最重要的事情,但它会减少代码长度,并且更适合处理大文件。
答案1
有了sed
,你可以做
sed -E 'N;s/(.*)(\n) */\2\1/;/.{81}/s_^(.)(.{,79}[-+/*]) *_\2\1_;/^\n/!P;D' filename
-E
用于使用扩展正则表达式,使其更易于阅读N
将下一行添加到缓冲区s/(.*)(\n) */\2\1/
连接行,将换行符移至开头并删除缩进空格/.{81}/
对于超过 80 个字符的行有效;在这种情况下,执行s_^(.)(.{,79}[-+/*]) *_\2\1_
将换行符移动到最后一个符号/^\n/!P
如果缓冲区中的第一行不为空,则打印它D
从缓冲区的其余部分开始
正如 mosvy 所指出的,该脚本在行中存在尾随反斜杠的问题,因此应该使用s/\\$//
.另外,如果可能有更长的输入行(这不是OP的问题,但可能是未来的读者的问题),可以N
将/.{80}/!N
.所以整个脚本是
sed -E 's/\\$//;/.{80}/!N;s/(.*)(\n) */\2\1/;/.{81}/s_^(.)(.{,79}[-+/*]) *_\2\1_;/^\n/!P;D' filename