Come abbinare gli spazi bianchi in sed?


218

Come posso abbinare gli spazi bianchi in sed? Nei miei dati voglio abbinare tutti i 3+ caratteri successivi (spazio tabulazione) e sostituirli con 2 spazi. Come si può fare?

Risposte:


226

La classe di caratteri \scorrisponderà ai caratteri degli spazi bianchi <tab>e <space>.

Per esempio:

$ sed -e "s/\s\{3,\}/  /g" inputFile

sostituirà ogni sequenza di almeno 3 spazi bianchi con due spazi.


NOTA : per la conformità POSIX, utilizzare la classe di caratteri [[:space:]]anziché \s, poiché quest'ultima è un'estensione GNU sed. Vedere le specifiche POSIX per sed e BRE


5
aha! È stato l'interruttore -e mancante che mi ha preso.
sequoia mcdowell,

25
Ho anche dovuto aggiungere l'opzione '-r' che abilita i regex estesi per far riconoscere a sed \ 's' come spazio.
HUB,

39
Con Apple sedho dovuto usare [[:space:]]perché \snon ha funzionato per me. Forse \sè un'estensione GNU sed ?
Jared Beck,

2
@JaredBeck grazie, stavo esaurendo le idee per cui il mio regex semplice non funzionava .. Questo è zoppo, pensavo fosse regex esteso standard .. Inoltre -r non funziona e -E ha fatto squat
Karthik T

3
Invece di [[:space:]uno si potrebbe usare [[:blank:]]che corrisponde solo a schede e spazi orizzontali (ma nessuna nuova riga, scheda verticale ecc.).
stefanct,

67

Funziona su MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

2
sai se funziona su tutte le distro Linux?
anfibio,

2
Non in generale, GNU sed non avrà -E. Dalla pagina man di BSD sed: "Le opzioni -E, -a e -i sono estensioni di FreeBSD non standard e potrebbero non essere disponibili su altri sistemi operativi."
Brad Koch,

1
Perché hai bisogno del flag -E, per l'operatore +? La maggior parte delle espressioni probabilmente andrebbe bene con *, quindi funzionerebbe su altre piattaforme.
Samuel,

5
@Samuel Se usi *, la regex corrisponderà a zero o più spazi e otterrai uno spazio tra ogni personaggio e uno spazio a ciascuna estremità di ogni riga. Se non hai il flag -E, allora vuoi sed "s/[[:space:]]\+/ /g"abbinare uno o più spazi.
jbo5112,

1
FWIW, la sed di NetBSD supporta anche la -Ebandiera.
mcandre,

13

Alcune versioni precedenti di sed potrebbero non riconoscere \ s come token di corrispondenza degli spazi bianchi. In tal caso è possibile abbinare una sequenza di uno o più spazi e schede con '[XZ] [XZ] *' dove X è uno spazio e Z è una scheda.


1
Quindi, per la particolare necessità qui, con una vecchia sed, potresti fare: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / /' inputfile dove X è una scheda e Z è uno spazio.
Marnix A. van Ammers,

10
sed 's/[ \t]*/"space or tab"/'

2
Questo è garantito per funzionare su qualsiasi versione di sedqualsiasi sistema? Altrimenti potrebbe valere la pena menzionare dove questo funziona in modo simile alle altre risposte, solo così conosciamo i limiti e dove questo potrebbe non avere il risultato desiderato.
Mokubai

2
Questo RE è quello che uso per abbinare gli spazi bianchi. È più semplice delle classi di caratteri solo per abbinare tab o spazio. Utilizza solo le convenzioni più elementari delle espressioni regolari, quindi dovrebbe funzionare ovunque con un'implementazione funzionale delle espressioni regolari.
Nate,

3
Su Mac 10.9.5 questo corrisponde per spazi e 't'. Ho usato Michael Douma sopra per abbinare i caratteri degli spazi bianchi (funziona anche con -e).
Alien Life Form

Non funziona in modo sensato sul mio sistema SUSE. Corrisponde al primo posto sulla riga in cui vi sono zero o più spazi, che è prima del primo carattere. Dubito che sia la funzione prevista, e certamente non era il caso d'uso richiesto. Credo che tu voglia cambiare '*' per '\ +' (o '\ {3, \}' per la domanda) e magari mettere un g alla fine del comando sed per abbinare tutte le occorrenze del pattern. Anche la sostituzione di [\ t] con [[: space:]] può essere desiderabile, nel caso in cui ci sia qualcos'altro per gli spazi bianchi nella linea.
jbo5112,
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.