Utilizo Linux y FreeBSD (específicamente, utilizo Debian Linux y PC-BSD), y encontré algo extraño sed
.
Con frecuencia necesito convertir archivos de "valores separados por tabulaciones" a "valores separados por comas". La forma más simple que conozco es usar sed
, así:
sed 's/\t/,/g' inputFile.txt > outputFile.csv
Esto funciona perfectamente en Linux: reemplaza cada pestaña con una coma ... pero en FreeBSD, ¡no reemplaza nada!
¿Me estoy perdiendo de algo? ¿Existe una sintaxis con FreeBSD sed
que sea diferente a la de Linux?
-E
opción hace el truco (tanto en FreeBSD como en Mac OS X).Sí, hay varias diferencias, el comportamiento de
-i
ser el único que conozco fuera de mi cabeza.Nunca he usado BSD, así que realmente no puedo ayudar con los detalles, pero podría ser una solución alternativa en su
tr
lugar:Un efecto secundario agradable es que
tr
debería ser significativamente más rápido. Probé eso en mi Linux usando un archivo de prueba con 50000 líneas, cada una de las cuales tenía 2 pestañas:fuente
tr '\t' ,
Es más portátil quetr $'\t' ,
.tr '[\t]' '[,]'
incluso sería portátil para algunos viejos sistemas SysV.cut
. La especificación POSIX paratr
está ahí . Me equivoqué sobre lo[
necesario para el viejo SysV. Como señala la especificación POSIX,[
solo es necesario para los rangos allí.Sí, a diferencia de GNU
sed
FreeBSDsed
no interpreta las secuencias de escape ANSI C como\t
en las expresiones regulares.Una forma de obtener un denominador menos común en este caso es usar
printf
.El comportamiento de las
sed -i
ediciones de archivos in situ puede hacerse compatible si un interruptor u opción sigue inmediatamente al-i
interruptor, por ejemplo,sed -i -e 's/x/X/g' file
funciona tanto para GNUsed
como para FreeBSDsed
.Las versiones recientes de FreeBSD
sed
(FreeBSD 8.1 o más reciente) tienen el-r
interruptor para aumentar la compatibilidad con GNUsed
.(Además, el uso de clases de caracteres POSIX en
sed
expresiones regulares también es una buena manera de garantizar la compatibilidad).Para ver una
sed
implementación alternativa conforme a POSIX, consulte: minised: una implementación SED más pequeña, más barata y más rápida .fuente
Debe usar un TABcarácter literal en lugar de
\t
:Vea este comentario de Stephane sobre otra pregunta.
El siguiente artículo también puede interesarle:
Cito la parte relevante:
fuente
Después de iniciar sesión, veo el próximo anuncio y lo guardo. Espero que sea útil para otros también
fuente
-i
opción ya estaba cubierta