Zastąp wszystkie wystąpienia dwóch spacji po zakończeniu zdania tylko jedną spacją

9

Utknąłem w włączaniu wyrażeń regularnych z poleceniem sed.

P: Chcę zastąpić wszystkie wystąpienia dwóch spacji po końcu zdania tylko jedną spacją.

Oto co zrobiłem:

sed 's/^ $/^$/' file  

I nie zastąpił dwóch spacji jedną spacją po zakończeniu zdania.

Otrzymuję wynik:

This is the output.  Hello Hello

Chcę wynik:

This is the output. Hello Hello
Zeus
źródło
@Rahul Chcę, aby wynik zawierał spację po zakończeniu zdania. Nie dwie spacje jak w pierwszym zdaniu. Chcę wynik drugiego zdania
Zeus
Odpowiedź @Jasen jest poprawna. BTW, wypróbowane polecenie oznacza: Zastąp wiersz składający się tylko z pojedynczej spacji pustą linią. Dlatego nie zrobił tego, co chciałeś.
rexkogitans
1
Wstaw tutaj: wojna na pojedynczej lub podwójnej spacji po
kropce
@gerrit Ta wojna została utracona jakieś 20 lat temu. ;)
h4ckNinja

Odpowiedzi:

12
 sed 's/\.   */. /g' < file

zamień kropkę, a następnie dwie lub więcej spacji kropką, a następnie pojedynczą spacją

Jasen
źródło
Twoje polecenie faktycznie działa dla całego akapitu. Właśnie tego chciałem. Dzięki!
Zeus
lub sed -r 's/\.\s+/. /g' filez GNU sed ...
Sundeep
@ wykorzystanie spasic sed -Ezamiast sed -r. Działa to z GNU sed i * BSD sed (w tym Mac OS X) i niektórymi innymi. Planowane jest włączenie go jako standardu do POSIX „już wkrótce”.
cas
@cas Pamiętam kiedyś, zasugerowałem sed -Ekomuś na tej stronie, który nie działał, ale sed -rdziałał. Pracowałem sam z GNU sed, więc nie mam pojęcia o POSIX i innych odmianach. Spróbuję dołączyć ten szczegół w przyszłości , dzięki :)
Niedziela
To musiała być stara wersja GNU sed. Wspierają już -Eod dłuższego czasu (od co najmniej 2011 r., Ale strony podręcznika i strony informacyjne wciąż tylko wspominają -r)
cas
13

Twoje sedpolecenie 's/^ $/^$/'nie zrobi tego, co chcesz. Po prostu zamień wszystkie linie zawierające jedną spację linią zawierającą ^$.

W zależności od tego, jakie znaki oznaczają koniec zdania, możesz:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Spowoduje to zastąpienie 2 lub więcej spacji po ., ?lub !tylko z jednej przestrzeni.

Cuonglm
źródło
1
można skrócić dosed -r 's/([.?!])\s+/\1 /g' file
Sundeep
Dzięki. Ale czy uprzejmie wyjaśniłbyś, dlaczego wykorzystałeś tyle okrągłych nawiasów kwadratowych? To trochę mylące.
Zeus
1
@spasic: Działa to tylko z GNU sed, zaktualizowane w wersji uproszczonej.
cuonglm
@Zeus: To standardowa składnia z domyślnym BRE.
cuonglm
1
Nie, oryginalny sedskrypt edycyjny zastąpi dowolny wiersz zawierający jedną spację literalnym ciągiem znaków ^$.
Kusalananda
7

Tego możesz szukać,

tr -s " " <filename

Próba,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Za pomocą sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello
Rahul
źródło
2
Cóż, działa dzięki, ale muszę dołączyć polecenie sed. Uprzejmie powiedz coś podobnego do powyższego, na przykład podstawienie, zmiana tekstu itp. W sed.
Zeus
2
Nie wiedziałem o tej funkcji tr
Jasen
3
Takie podejście zastąpi również dwie spacje, które nie są końcem zdania.
cuonglm