Jak usunąć wszystkie końcowe spacje z całego projektu? Rozpoczynając od katalogu głównego i usuwając końcowe białe znaki ze wszystkich plików we wszystkich folderach.
Chciałbym również móc bezpośrednio modyfikować plik, a nie tylko drukować wszystko na standardowe wyjście.
bash
whitespace
iamjwc
źródło
źródło
Odpowiedzi:
Oto rozwiązanie dla OS X> = 10.6 Snow Leopard.
Ignoruje foldery .git i .svn oraz ich zawartość. Nie pozostawi też pliku kopii zapasowej.
źródło
\+
zamiast*
w ciągu zastępczym - w przeciwnym razie pasuje w każdym wierszu.sed: RE error: illegal byte sequence
dla mnie powraca .export LANG=C
i spróbuj ponownieexport LC_CTYPE=C
jak znalazłem tutaj: stackoverflow.com/questions/19242275/…Posługiwać się:
jeśli nie chcesz generować plików „.bak”:
jako użytkownik zsh możesz pominąć wywołanie funkcji find i zamiast tego użyć:
Uwaga: Aby zapobiec niszczeniu
.git
katalogu, spróbuj dodać:-not -iwholename '*.git*'
.źródło
.git
katalogi, bez względu na to, jak głęboko zagnieżdżone.find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
rsync -rv --exclude=.git repo/ repo2/
po czym lokalne zmianyrepo
były również w (nieuszkodzone)repo2
.Dwa alternatywne podejścia, które działają również z znakami nowej linii DOS (CR / LF) i całkiem nieźle radzą sobie z unikaniem plików binarnych :
Ogólne rozwiązanie sprawdzające, czy typ MIME zaczyna się od
text/
:Rozwiązanie Matta specyficzne dla repozytorium Git, które wykorzystuje
-I
opcjęgit grep
pomijania plików, które Git uważa za binarne:źródło
sed
opcja sufiksu do-i
jest opcjonalna , ale w BSDsed
nie. Ściśle rzecz biorąc, i tak nie jest to konieczne, więc po prostu je usunę.W Bash:
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
Uwaga: Jeśli używasz
.git
repozytorium, warto dodać:-not -iwholename '.git'
.źródło
To zadziałało dla mnie w OSX 10.5 Leopard, który nie używa GNU sed ani xargs.
Po prostu bądź ostrożny, jeśli masz pliki, które muszą zostać wykluczone (tak zrobiłem)!
Możesz użyć -prune, aby zignorować określone katalogi lub pliki. W przypadku plików Pythona w repozytorium git możesz użyć czegoś takiego:
źródło
find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'
. Zastąpdir
odpowiednim katalogiem jako katalogiem najwyższego poziomu, z którego ma nastąpić rekurencja.sed -i .bak
? Czy nie powinno byćsed -i.bak
(bez spacji)?Ack został stworzony do tego rodzaju zadań.
Działa tak jak grep, ale wie, że nie schodzi do miejsc takich jak .svn, .git, .cvs itp.
O wiele łatwiejsze niż przeskakiwanie przez obręcze za pomocą funkcji find / grep.
Ack jest dostępny za pośrednictwem większości menedżerów pakietów (jako Ack lub Ack-Grep ).
To tylko program w Perlu, więc jest również dostępny w wersji jednoplikowej, którą można po prostu pobrać i uruchomić. Zobacz: Ack Install
źródło
ack
jest wspaniałe. Używam go od wielu lat i jest dostępny w prawie wszystkich repozytoriach pakietów dla większości dystrybucji.ex
Spróbuj użyć edytora Ex (część Vima):
Uwaga: w przypadku rekurencji (bash4 i zsh) używamy nowej opcji globbingu (
**/*.*
). Włącz przezshopt -s globstar
.Możesz dodać następującą funkcję do swojego
.bash_profile
:sed
Aby użyć
sed
, sprawdź: Jak usunąć końcowe spacje za pomocą seda?find
Znajdź następujący skrypt (np.
remove_trail_spaces.sh
) Do usuwania końcowych białych znaków z plików:Uruchom ten skrypt z katalogu, który chcesz przeskanować. W systemie OSX na końcu usunie wszystkie pliki kończące się na
.bak
.Lub tylko:
co jest zalecane przez Spring Framework Code Style .
źródło
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
usuwa tylko jedną spację na końcu zamiast wszystkich.Skończyło się na tym, że nie korzystałem z funkcji znajdowania i nie tworzyłem plików kopii zapasowych.
W zależności od głębokości drzewa plików ta (krótsza wersja) może być wystarczająca dla Twoich potrzeb.
UWAGA dotyczy to również, na przykład, plików binarnych.
źródło
Zamiast wykluczać pliki, oto odmiana powyższej wyraźnie białej listy plików, w oparciu o rozszerzenie pliku, które chcesz usunąć, możesz doprawić do smaku:
źródło
-name "*.rb*"
Skończyło się na tym, że uruchomiłem to, co jest mieszanką wersji pojo i adams.
Wyczyści zarówno końcowe białe znaki, jak i inną formę końcowych białych znaków, powrót karetki:
Nie dotknie folderu .git, jeśli taki istnieje.
Edycja : poprawiono trochę bezpieczeństwa po komentarzu, nie pozwalając na pobieranie plików zawierających „.git” lub „.svn”. Ale uwaga, jeśli masz jakieś , będzie dotykać plików binarnych. Użyj
-iname "*.py" -or -iname "*.php"
after,-type f
jeśli chcesz, aby dotyczyło tylko np. Plików .py i .php.Aktualizacja 2 : Zastępuje teraz wszelkiego rodzaju spacje na końcu linii (co oznacza również tabulatory)
źródło
To działa dobrze ... dodaj / usuń --include dla określonych typów plików:
źródło
Rubin:
źródło
Używam wyrażeń regularnych. 4 kroki:
Spowoduje to usunięcie wszystkich końcowych spacji na końcu każdego wiersza we wszystkich plikach. Możesz też wykluczyć niektóre pliki, które nie spełniają tej potrzeby.
źródło
1) Wiele innych odpowiedzi używa
-E
. Nie jestem pewien dlaczego, ponieważ jest to nieudokumentowana opcja zgodności z BSD .-r
należy użyć zamiast tego.2) Użyj innych odpowiedzi
-i ''
. To powinno być sprawiedliwe-i
(lub-i''
jeśli jest to preferowane), ponieważ-i
ma przyrostek zaraz po.3) Rozwiązanie specyficzne dla Git:
Pierwsza z nich rejestruje alias git,
check-whitespace
który zawiera listę plików z końcowymi spacjami. Drugi biegniesed
na nich.Używam
\t
raczej niż,[:space:]
ponieważ zazwyczaj nie widzę pionowych zakładek, kanałów danych i nierozerwalnych spacji. Twój pomiar może się różnić.źródło
To działa dla mnie (Mac OS X 10.8, GNU sed zainstalowany przez Homebrew):
Usunięto końcowe spacje, zastąpiono tabulatory spacjami, zastąpiono Windows CRLF systemem Unix
\n
.Co ciekawe, muszę uruchamiać to 3-4 razy, zanim wszystkie pliki zostaną naprawione, zgodnie ze wszystkimi
gsed
instrukcjami czyszczenia .źródło