Sostituisci tutte le occorrenze di due spazi dopo la fine di una frase con un solo spazio


9

Sono bloccato nel includere espressioni regolari con un comando sed.

Q: Voglio sostituire tutte le occorrenze di due spazi dopo la fine di una frase con una sola volta spazio.

Ecco cosa ho fatto:

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

E non ha sostituito due spazi con uno spazio dopo la fine della frase.

Uscita ottengo:

This is the output.  Hello Hello

Uscita che desidero:

This is the output. Hello Hello

@Rahul Voglio che l'output contenga una volta lo spazio dopo la fine della frase. Non due spazi come nella prima frase. Voglio l'output della seconda frase
Zeus,

La risposta di @Jasen è corretta. A proposito, il comando che hai provato significa: sostituire una riga composta da un solo spazio bianco con una riga vuota. Ecco perché non ha fatto quello che volevi.
rexkogitans,

1
Inserisci qui: war on single vs. double space dopo full stop
gerrit

@gerrit Quella guerra è andata persa circa 20 anni fa. ;)
h4ckNinja,

Risposte:


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

sostituisci punto seguito da due o più spazi con punto seguito da un singolo spazio.


Il tuo comando funziona effettivamente per l'intero paragrafo. Questo è esattamente quello che volevo. Grazie!
Zeus,

o sed -r 's/\.\s+/. /g' filecon GNU sed ...
Sundeep,

@spasic use sed -Epiuttosto che sed -r. Funziona con GNU sed e * BSD sed (incl. Mac OS X) e alcuni altri. È programmato per l'inclusione come standard in POSIX "molto presto".
Cas

@cas Ricordo qualche tempo fa, ho suggerito sed -Ea qualcuno su questo sito che non ha funzionato ma ha sed -rfunzionato .. Ho lavorato con GNU sed da solo, quindi nessuna idea su POSIX e altre varianti .. proverò a includere questo dettaglio in futuro , grazie :)
Sundeep,

Deve essere stata una vecchia versione di GNU sed. Sono supportati -Eda un po 'di tempo (almeno dal 2011, ma le pagine man e info menzionano ancora solo -r)
Cas

13

Il tuo sedcomando 's/^ $/^$/'non farà quello che vuoi. Sostituisce semplicemente tutte le righe che contengono uno spazio con una riga contengono ^$.

Dipende da quali caratteri segnano la fine della frase, puoi fare:

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

Questo sostituirà 2 o più spazi dopo ., ?o !con un solo spazio.


1
può essere abbreviato insed -r 's/([.?!])\s+/\1 /g' file
Sundeep

Grazie. Ma spiegheresti gentilmente perché hai usato così tante parentesi quadre tonde? È un po 'confuso.
Zeus,

1
@spasic: funziona solo con GNU sed, aggiornato con la versione semplificata.
cuonglm,

@Zeus: sintassi standard con BRE predefinito.
cuonglm,

1
No, lo sedscript di modifica originale sostituirà qualsiasi riga contenente un singolo spazio con la stringa letterale ^$.
Kusalananda

7

Questo è ciò che potresti cercare,

tr -s " " <filename

Campione,

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

Utilizzando 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
Bene, funziona grazie, ma devo includere il comando sed. Si prega di dire qualcosa di simile a quanto mostrato sopra, come la sostituzione, modificare il testo ecc. In sed.
Zeus,

2
Non ero a conoscenza di questo film,
Jasen,

3
Questo approccio sostituirà anche due spazi che non sono la fine della frase.
cuonglm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.