Mam prosty skrypt powłoki, który usuwa końcowe spacje z pliku. Czy istnieje sposób, aby ten skrypt był bardziej zwarty (bez tworzenia pliku tymczasowego)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Viktor
źródło
źródło
mv
zamiastcat
irm
. Dlaczego w ogóle tego używaszcat
? Dlaczego nie używaćcp
?cat
do nadpisania oryginalnego pliku, a nie domv
zastąpienia danych w oryginalnym pliku (tj. Nie spowoduje zerwania twardych linków). Używaniesed -i
zgodnie z propozycją w wielu rozwiązaniach tego nie zrobi. IOW, po prostu rób to, co robisz.Odpowiedzi:
Można użyć w miejsce opcji
-i
wsed
systemie Linux i Unix:Pamiętaj, że to wyrażenie usunie końcowe znaki
t
w systemie OSX (możesz użyć,gsed
aby uniknąć tego problemu). Może je również usunąć z BSD.Jeśli nie masz gsed, oto poprawna (ale trudna do odczytania) składnia sed na OSX:
Ostatecznie trzy ciągi w apostrofach zostają połączone w jeden argument / wyrażenie. W bash nie ma operatora konkatenacji, po prostu umieszczasz ciągi jeden po drugim bez spacji między nimi.
W
$'\t'
postanawia dosłownym charakterze języczka bash (stosując ANSI-C cytowanie ), tak, aby było prawidłowo łączone w wyrażeniu.źródło
sed: Not a recognized flag: i
t
:)\t
to zakładka dla tych, którzy jeszcze nie wiedzą.Przynajmniej na Mountain Lion, odpowiedź Viktora usunie również znak „t”, gdy znajduje się na końcu linii. Następujące rozwiązania rozwiązują ten problem:
źródło
-E
wskazać „rozszerzone (nowoczesne) wyrażenia regularne”sed
na El Capitan nie.Dzięki codaddict za zasugerowanie
-i
opcji.Następujące polecenie rozwiązuje problem w systemie Snow Leopard
źródło
\t
seda innego niż GNU sed i jest on interpretowany jako literalna literat
. Wydaje się, że polecenie tylko działa, prawdopodobnie dlatego, żet
w Twoim pliku nie ma TAB-a w końcowej spacji ani na końcu zdania. Używanie''
bez określenia przyrostka kopii zapasowej nie jest zalecane.Najlepiej też podać 1 dolara:
źródło
źródło
Mam skrypt w moim .bashrc, który działa pod OSX i Linuxem (tylko bash!)
do którego dodaję:
źródło
Dla tych, którzy szukają wydajności (wiele plików do przetworzenia lub ogromne pliki), użycie
+
operatora powtórzeń zamiast*
sprawia, że polecenie jest ponad dwukrotnie szybsze.Z sedem GNU:
Szybko przetestowałem też coś innego: używanie
[ \t]
zamiast[[:space:]]
również znacznie przyspiesza proces (GNU sed v4.4):źródło
Dla żartu:
źródło
W przypadku określonego w
sed
The-i
opcja, że inni już wspomniano jest zdecydowanie najprostszy i sanest jeden.W bardziej ogólnym przypadku,
sponge
zmoreutils
kolekcji robi dokładnie to, co chcesz: umożliwia zastąpienie pliku wynikiem jego przetwarzania w sposób specjalnie zaprojektowany, aby krok przetwarzania nie potknął się o siebie, nadpisując ten sam plik, pracować nad. Cytującsponge
stronę podręcznika :https://joeyh.name/code/moreutils/
źródło
Aby usunąć tylko białe spacje (w moim przypadku spacje i tabulatory) z wierszy zawierających przynajmniej jeden znak niebędący białymi znakami (w ten sposób puste wcięte wiersze nie są dotykane):
źródło