有没有一种好的自动化方法来制作通用文本块?

有没有一种好的自动化方法来制作通用文本块?

我经常从 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

相关内容