[編輯:固定空白修整]
[編輯#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
一起使用。
**/*(。)是一個zsh glob。它是對許多文件執行操作的另一種方式。因此perl語句將爲其找到的每個文件執行一次。 – jhogendorn 2011-02-16 02:38:06