Sed, aby usunąć puste miejsca

28

Czy ktoś wie, jak używać Sed do usuwania wszystkich pustych spacji w pliku tekstowym? Próbowałem w tym celu użyć polecenia usuwania „d”, ale nie mogę tego rozgryźć

Justin
źródło

Odpowiedzi:

35

Jakiego rodzaju „przestrzeń”?

„Usunąć wszystkie puste spacje” może oznaczać jedną z różnych rzeczy:

  1. usuń wszystkie wystąpienia znaku spacji, kodu 0x20.
  2. usuń całą przestrzeń poziomą, w tym znak tabulacji w poziomie, „ \t
  3. usuń wszystkie białe znaki, w tym znak nowej linii „ \n” i inne

Właściwe narzędzie do pracy

Jeśli sedz jakiegoś ukrytego powodu nie jest to wymagane, lepiej użyj odpowiedniego narzędzia do pracy.

Polecenie to trma głównie zastosowanie w tłumaczeniu (stąd nazwa „tr”) listy znaków na listę innych znaków. Jako przypadek narożny może tłumaczyć na pustą listę znaków; Opcja -d( --delete) usuwa znaki pojawiające się na liście.

Lista znaków może wykorzystywać klasy znaków w [:...:]składni.

  1. tr -d ' ' < input.txt > no-spaces.txt
  2. tr -d '[:blank:]' < input.txt > no-spaces.txt
  3. tr -d '[:space:]' < input.txt > no-spaces.txt

Kiedy nalegam sed

W przypadku sed [:...:]składnia klas znaków musi być połączona ze składnią zestawów znaków w wyrażeniach regularnych [...], co powoduje nieco zamieszanie [[:...:]]:

  1. sed 's/ //g' input.txt > no-spaces.txt
  2. sed 's/[[:blank:]]//g' input.txt > no-spaces.txt
  3. sed 's/[[:space:]]//g' input.txt > no-spaces.txt
Volker Siegel
źródło
1
+1, notacja POSIX dla pustego miejsca jest właściwą drogą.
Avinash Raj,
1
Świetna wskazówka do użycia tr do tego zadania, działa świetnie. Jedyną rzeczą, którą musiałem dostosować, było to, że tr czyta dane wejściowe ze standardowego wejścia, więc dla mnie zadziałało tr -d ' ' < input.txt > no-spaces.txt.
Sky
@ Komentarz Sky działa w moim systemie macOS (nie testowany w systemie Linux). Może odpowiedź powinna zostać zaktualizowana?
iplus26,
Dziękuję bardzo @Sky, to naprawdę zły błąd. Naprawię teraz trzy linie tr. (Widzisz to gdzieś indziej?)
Volker Siegel
7

Możesz użyć tego do usunięcia wszystkich białych znaków w file:

 sed -i "s/ //g" file
Cyrus
źródło
2
Nie ma kości. Próbowałem też podobnego podejścia. Nie działa
Justin
Czy chcesz usunąć białe znaki lub karty?
Cyrus
1
usuń biały znak
Justin
2
Prosty test:man sed | sed "s/ //g"
Cyrus
1
@starscream_disco_party: to samo. Możesz zastąpić wszystkie 3 /inną postacią, np .:sed "ss ssg"
Cyrus