[編集: 空白のトリミングを修正]
[編集 #2: ファイルの末尾から末尾の空白行を取り除く]
perl -i.bak -pe 'if (defined $x && /\S/) { print $x; $x = ""; } $x .= "\n" x chomp; s/\s*?$//; 1 while s/^(\t*) /$1\t/; if (eof) { print "\n"; $x = ""; }' **/*(.)
これにより、末尾の空白行がファイルから取り除かれますが、ファイルの末尾には1 行だけが残り\nます。ほとんどのツールはこれを想定しており、ほとんどのエディターでは空白行として表示されません。\nただし、最後の を削除したい場合はprint "\n";、コマンドからその部分を削除してください。
\nこのコマンドは、空白以外の文字を含む行が表示されるまで文字を「保存」することによって機能します。その後、その行を処理する前にすべての文字を出力します。
.bak元のファイルのバックアップを作成しないように削除します (自己責任で使用してください!)
\s*?は、 DOS 改行構文\rの最初の文字であるを含む、0 個以上の空白文字に貪欲に一致しません。\r\nPerl では$、行末または final の直前で一致するため、貪欲に一致しない (最初に 0 幅の一致を試行し、次に 1 幅の一致を試行するなど)\nという事実と組み合わせると、*?正しいこと。
1 while s/^(\t*) /$1\t/は、任意の数のタブで始まり、その後に 4 つのスペースが続く行を、これが不可能になるまで、以前よりも 1 つ多いタブに繰り返し置き換える単なるループです。したがって、一部の行がすでに部分的にタブに変換されていても、すべての\t文字が 4 で割り切れる列から始まっていれば機能します。
前に構文を見たことがありません**/*(.)。おそらくそれはzsh拡張機能ですか? で動作する場合はsed、で動作しperlます。