2015-12-14 88 views
1

我嘗試刪除所有Java文件中行尾的空格。我從互聯網上找到了這樣一個命令,但它在MacOSX上不起作用。替換文件中行尾的空格

find ./ -type f -name '*.java' -exec sed -i '' 's/\s+/\n/g' {} \; 

我還沒弄清楚爲什麼它不起作用。

+0

是否說出任何錯誤? – sat

+0

@sat沒有任何錯誤,但沒有功能。我想sed正則表達式字符串應該逃脫,但不是如何做到這一點。 – lucky1928

回答

3

的Mac OS X不使用GNU sed(它使用BSD sed),所以默認情況下不承認\s爲「空間」(或+爲「一個或多個」)。但是,BSD sed確實支持-i選項(與其他答案相反),但它需要一個備份後綴(如果您勇敢並且確信您的腳本正確,可以爲空字符串)。

用途:

find . -type f -name '*.java' -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} + 

或(在BSD sed-E,你會使用-r與GNU sed,但它似乎直覺你正在使用的正則表達式的風格),使用擴展的正則表達式:

find . -type f -name '*.java' -exec sed -i '' -E 's/[[:space:]]+$//' {} + 

sed Mac OS X的手冊頁是指您man 7 re_format-E啓用「擴展正則表達式」。謹慎閱讀; 'extended'與'enhanced'不一樣!

在行尾查找一個或多個空格字符;什麼也不換。儘可能多的文件在一次(方便{}+find命令;使用;而不是+強制每個文件sed)。

[[:space:]]表示法是POSIX標準,涵蓋了空白和製表符以及其他空白區域。您可以使用[[:blank:]]來處理空白和製表符。如果您確定只有尾隨空白(並且沒有尾隨標籤),則可以用簡單的空白替換那個笨重但精確的術語('s/ +$//')。 (請參閱POSIX Regular expressions。)

在確保腳本正常工作之前,我不會使用空備份擴展。你可能會對你的文件造成嚴重破壞。

+0

太棒了,第一個命令工作正常,但第二個命令沒有。 – lucky1928

+0

哇!我錯過了命令行中的-E - 提到它,但沒有將它包含在示例命令中。抱歉! –

+0

即使使用'-E'選項,它似乎仍然不起作用 – lucky1928

0

sed -i在Mac OS上不受支持。如果你想使用sed -i,我建議通過像homebrew這樣的軟件包管理器來安裝GNU coreutils。

brew install coreutils

有關的coreutils的更多信息,請參閱brew info coreutils

+3

'sed -i .bak'由Mac OS X(BSD)'sed'支持。不支持的是不提供後綴;你必須使用'sed -i'''來實現它。 –