プレーンテキストブロックを作成する自動化された良い方法はありますか?

プレーンテキストブロックを作成する自動化された良い方法はありますか?

私は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

おすすめ記事