[編集: 空白のトリミングを修正]
[編集 #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\n
Perl では$
、行末または final の直前で一致するため、貪欲に一致しない (最初に 0 幅の一致を試行し、次に 1 幅の一致を試行するなど)\n
という事実と組み合わせると、*?
正しいこと。
1 while s/^(\t*) /$1\t/
は、任意の数のタブで始まり、その後に 4 つのスペースが続く行を、これが不可能になるまで、以前よりも 1 つ多いタブに繰り返し置き換える単なるループです。したがって、一部の行がすでに部分的にタブに変換されていても、すべての\t
文字が 4 で割り切れる列から始まっていれば機能します。
前に構文を見たことがありません**/*(.)
。おそらくそれはzsh
拡張機能ですか? で動作する場合はsed
、で動作しperl
ます。