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

@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ą


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.