¿Por qué la coincidencia de patrones sed no trata '\t' como un ¿personaje?

Tengo un archivo con algunas pestañas principales e intenté convertir las pestañas en espacios usando sed:

cat test_file | sed -e 's/[\t]/    /g'

Funciona correctamente en varias versiones de UNIX, pero en mi Mac (Sierra) no trata '\t' como un escape para tabulador (hexadecimal 0x09), sino que lo trata como dos caracteres separados.

grep maneja correctamente el atajo \t para tab.

Respuestas (1)

BSD sedsigue el POSIXestándar para BRE's, consulte man 7 re_format. En particular lo siguiente:

                                             all other special charac-
 ters, including `\', lose their special significance within a bracket
 expression.

Tampoco se \ttrata de forma especial (como el carácter de tabulación) en el patrón.

Tienes las siguientes opciones:

# Type a literal tab in the /pattern/ with the keys <control><v><tab>
's/<control><v><tab>/    /g'

# Use a character class within the bracket expression
's/[[:cntrl:]]/    /g'

# Use ansi -c quoting
$'s/\t/    /g'

# Print the tab with printf
"s/$(printf '\t')/    /g"