2011-02-16 48 views
5

我有一個代碼庫,由於尾隨空白而導致衝突。我想清理它。如何清理代碼庫,尾隨空白,新行等

我會想:

  • 刪除所有尾隨空白
  • 在文件
  • 轉換所有行結束到UNIX(DOS2UNIX的)
  • 轉換所有的末尾刪除任何換行符領先空格到標籤,即4個空格到標籤。

  • 雖然忽略.git目錄。

我在OSX雪豹,並在的zsh

到目前爲止,我有:

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

偉大的工程,但sed中增加了一個新的行每倒是文件,該文件是沒有好處的結束。我不認爲sed可以停止這樣做,所以我如何刪除這些新行?這裏可能有一些awk的魔法可以應用。

(完整的答案也歡迎)

回答

5

[編輯:固定空白修整]
[編輯#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 = ""; }' **/*(.) 

這條從文件尾部空白行,但只留下一個\n在文件的末尾。大多數工具都期望這一點,並且在大多數編輯器中它不會顯示爲空行。但是,如果您確實想剝離最後一個\n,只需從命令中刪除print "\n";部分即可。

該命令通過「儲存」\n字符起作用,直到看到包含非空白字符的行 - 然後在處理該行之前將其全部打印出來。

刪除.bak避免創建原始文件的備份(需要您自擔風險使用!)

\s*?匹配零個或多個空白字符的非貪婪,包括\r,這是\r\n DOS行的第一個字符破解語法。在Perl中,$匹配在行尾或緊接在最後的\n之前,因此與*?非貪婪匹配的事實(先嚐試0寬度匹配,然後是1寬度匹配等等)它做對了。

1 while s/^(\t*) /$1\t/只是一個循環,它會重複替換任何以任意數量的選項卡開頭的行,然後是具有多於一個選項卡的4個空格,直到不再有可能。因此,它會工作,即使一些線已部分轉化爲標籤已經,提供了所有\t字符開始在由4

整除的專欄中,我還沒有看到之前的​​語法,想必這是一個zsh延期?如果它與sed一起使用,它將與perl一起使用。

+0

**/*(。)是一個zsh glob。它是對許多文件執行操作的另一種方式。因此perl語句將爲其找到的每個文件執行一次。 – jhogendorn 2011-02-16 02:38:06