2009-10-20 8 views
8

File1:usare sed per eliminare tutti i principali/seguenti spazi vuoti in un file di testo

hello 
    world 

come si potrebbe eliminare gli spazi vuoti che porta/finali all'interno di questo file usando sed - utilizzando un comando (nessun file intermedi)?

ho attualmente ottenuto:

sed -e 's/^[ \t]*//' a > b 

Per spazi iniziali.

sed 's/ *$//' b > c 

E questo per gli spazi finali.

+0

Mentre la risposta di @ ghostdog74 è buona, la risposta di @ mouviciel è * corretta *, in base alla domanda. Ho svalutato entrambi, ma credo che @mouviciel meriti di essere accettato come risposta corretta. –

+0

Hai ragione - mouviciel è ora accettato. Grazie a entrambi mouviciel (risposta corretta) e ghostdog74 (indicazioni per awk) per il loro tempo! – user191960

risposta

10

È quasi fatta:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 

Inoltre su alcuni sapori della sed, c'è anche un'opzione per la modifica in linea:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a 
+3

Considererei anche l'abbinamento '\ s', che è il generico 'tutti i caratteri dello spazio bianco'. –

+0

Non dovrebbe essere 'sed -e 's/^ [\ t] * //; s/[\ t] * $ //' a> c'? –

+0

Vedo ancora 'sed -e 's/^ [\ t] * //; s/[\ t] * $ /' a> c' che non funziona per me (bash versione 4.3.30, Funtoo-Linux). –

7

modo più semplice, utilizzando awk

awk '{$1=$1}1' file 

o

awk '{gsub(/^ +| +$/,"")}1' file 
+0

Il primo ha funzionato perfettamente ed è il più semplicistico - so che non è quello che ho chiesto (cioè sed) - ma è così elegante :). Guarderò in awk ora. – user191960

+0

Il primo rimuove tutti gli spazi vuoti spuri, non solo in testa e in coda.Il secondo funziona meglio. "awk" è un ottimo strumento. – mouviciel

+0

Ah, vedo gli altri spazi rimossi con il primo ora - il secondo funziona senza eliminazioni extra. – user191960

3
perl -lape 's/^\s+|\s+$//g' 

Onestamente, so perl espressioni regolari il migliore, così ho trovato perl -lape molto più facile da usare rispetto sed -e.

Inoltre, per rispondere alla domanda originale, è possibile avere sed eseguire più operazioni in questo modo:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/' 

A quanto pare si può anche mettere le due sostituzioni in una stringa e separarli con un punto e virgola, come indicato nella un'altra risposta

0

noti che nel caso più generale di applicazione di più filtri in una fila per un file di input senza utilizzare file intermedi, la soluzione è quella di utilizzare tubi:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c 

Ovviamente non sono richieste qui perché un'invocazione di sed è sufficiente, ma se il secondo comando sed era qualcosa di diverso, come uniq o sort, allora questo modello è quello giusto.