2011-12-06 32 views
5

Desidero sostituire TAB s in stdout con punto e virgola, eseguendo sed dalla shell ZSH.sed sostituire il TAB originale

ho capito si può normalmente (in altre shell?) Usa:

somecommand | sed 's/\t/;/g' 

Tuttavia, questo non funziona per me in ZSH-shell sotto FreeBSD. Il \t non corrisponde ai tabulatori. Perchè è questo? Ho anche provato più backslash (fino a 5).


Questo funziona:

somecommand | sed 's/[TAB]/;/g' 

, dove [TAB] è un vero TAB -CHARACTER, inserita inserendo Ctrl-V seguito dal pulsante TAB sulla tastiera.

risposta

9

L'uso di zsh non ha nulla a che fare con esso. \t è un'estensione GNU delle espressioni regolari utilizzate in sed. Su un BSD sed, non hai le estensioni, quindi devi usare la scheda letterale.

+0

Grazie, questo ha davvero risolto le cose per me! – poplitea

+9

@poplitea Se il tuo script verrà eseguito solo in ksh93, bash o zsh (al contrario di altre varianti sh come pdksh, Bourne o ash), allora puoi usare '$ 's/\ t /; /' g' dove il shell fa l'espansione di backslash e 'sed' vede un carattere tab letterale. – Gilles

+0

@Gilles: fantastico! Sapevo di $(), ma non di $ '' sostituzione. Grazie mille, questo semplifica la risoluzione del mio problema. Probabilmente dovresti averlo inserito in una risposta piuttosto che in un commento, sebbene (?). – poplitea

3

Un'opzione è preparare in anticipo il tuo script sed con printf.

scr="`printf 's/\t/;/g'`" 
somecommand | sed "$scr" 

Ma Michael ++ ... Ci possono essere altre varianti sed che supportano anche fughe printf-style, ma non è certamente "standard".

0

Se si conosce l'output del comando è un testo normale (solo schede & testo stampabile), è possibile utilizzare:

somecommand | sed -E 's/[[:cntrl:]]/;/g' 

-E accende espressioni regolari "estese", che possono contenere nomi di classe carattere.

Problemi correlati