8

末尾の空白が原因で競合が発生するコードベースがあります。きれいにしたいです。

私はしたいです:

  • 末尾の空白をすべて削除
  • ファイルの末尾にある改行文字を削除します
  • すべての行末を UNIX に変換 (dos2unix)
  • 先頭のすべてのスペースをタブに変換します。つまり、4 つのスペースをタブに変換します。

  • .git ディレクトリを無視します。

私はOSX Snow Leopardzshを使用しています。

これまでのところ、私は持っています:

sed -i "" 's/[ \t]*$//' **/*(.)

これはうまく機能しますが、 sed は、触れるすべてのファイルの最後に新しい行を追加します。これは良くありません。sed がこれを行うのを止めることができるとは思わないので、これらの新しい行を削除するにはどうすればよいですか? おそらく、ここで適用される awk マジックがいくつかあります。

(完全な回答も歓迎します)

4

2 に答える 2

6

[編集: 空白のトリミングを修正]
[編集 #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ます。

于 2011-02-16T01:56:13.080 に答える