2011-12-06 21 views
5

Quiero reemplazar TAB s en stdout con punto y coma, ejecutando sed desde el shell ZSH.sed replace literal TAB

Entiendo uno puede normalmente (en otras conchas?) Utilizar:

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

Sin embargo, esto no funciona para mí en ZSH-shell en FreeBSD. El \t no coincide con los tabuladores. ¿Por qué es esto? También intenté varias barras invertidas (hasta 5).


Esto funciona:

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

, donde [TAB] es un TAB -character real, insertada mediante la introducción de Ctrl-V seguido del botón TAB en mi teclado.

Respuesta

9

El uso de zsh no tiene nada que ver con eso. El \t es una extensión de GNU a las expresiones regulares utilizadas en sed. En BSD sed, no tiene las extensiones, por lo que debe usar la pestaña literal.

+0

¡Gracias, eso realmente me solucionó las cosas! – poplitea

+9

@poplitea Si su script solo se ejecuta en ksh93, bash o zsh (a diferencia de otras variantes sh como pdksh, Bourne o ash), entonces puede usar '$ 's/\ t /; /' g' donde el shell realiza la expansión de barra invertida y 'sed' ve un carácter de tabulación literal. – Gilles

+0

@Gilles: ¡Fantástico! Sabía de $(), pero no de $ '' sustitución. Muchas gracias, esto hace que sea más fácil resolver mi problema. Sin embargo, probablemente debiste poner esto en una respuesta en lugar de un comentario (?). – poplitea

3

Una opción es preparar su script sed antes de tiempo con printf.

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

Pero Michael ++ ... Existen muchas otras variantes de sed que también apoyan los escapes de estilo printf, pero ciertamente no es "estándar".

0

Si conoce el resultado del comando es un texto normal (sólo pestañas & texto imprimible), se puede utilizar:

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

-E convierte en expresiones regulares "extendidas", que pueden contener nombres de clases de caracteres.