Esto debería ser realmente simple, pero por alguna razón no está funcionando:
sed -i.bak -E 's/\t/ /' file.txt
En lugar de reemplazar caracteres de tabulación, está reemplazando t
caracteres. He probado todas las variaciones de esto que se me ocurrieron, jugando con citas, etc. Busqué en Google y encontré que todos los demás usaban expresiones bastante similares y parecen funcionar para ellos.
El -E
es una cosa de OS X. Pensé que el fracaso podría ser el resultado de una peculiaridad extraña de OS X sed
, así que lo probé también con Ruby (sin el -i
), y obtuve el mismo resultado:
ruby -pe '$_.gsub!(/\t/," ")' < file.txt > file.new
Estoy usando Bash 3.2.51 en OS X e iTerm, aunque no puedo ver cómo alguno de ellos podría ser terriblemente relevante. No he establecido ninguna variable de entorno extraña, aunque puedo publicar cualquiera que creas que puede ser relevante.
¿Qué podría estar mal?
ACTUALIZACIÓN : Debo haber hecho algún otro error tipográfico o de ortografía cuando probé la versión de Ruby, ya Gilles señala que hace el trabajo (y he nunca se tuvo que me guiaron a mal!). No estoy seguro de lo que sucedió, pero estoy bastante seguro de que debe haber sido mi error.
fuente
\t
en lased
declaración conCTRL-V<TAB>
dónde<TAB>
está la tecla de tabulación y laCTRL-V
tecla de control yv
presionar juntas.Respuestas:
La sintaxis
\t
para un carácter de tabulación en sed no es estándar. Ese escape es una extensión de sed de GNU . Encontrará muchos ejemplos en línea que lo usan porque mucha gente usa GNU sed (es la implementación de sed en Linux no incrustado). Pero OS X sed , como otros * BSD sed, no es compatible\t
con tab y en su lugar trata\t
como una barra invertida seguida det
.Hay muchas soluciones, como:
Use un carácter de tabulación literal.
Use
tr
oprintf
para producir un carácter de tabulación.Utilice la sintaxis de cadena de bash para permitir escapes de barra invertida .
Utiliza Perl, Python o Ruby. El fragmento de Ruby que publicaste funciona.
fuente
...sed
script (utilizado mediante la-f
opción), los caracteres de tabulación literal me parecen la única posibilidad. Al editar esto con vim,set noexpandtab
es importante.tr
técnica si quieres que tu compañero de trabajo te apuñale en la cara cuando leen tu guión.sed $'s/<regex>/\t/' file.txt
funciona para insertar, pero$
parece romper mi script cuando trato de incluir parte de la expresión regular en mi sustitución, es decir,sed $'s,\(ontology/[0-9]\+\),\t\txxx\1xxx\t\t,'
da `xxxxxx` con mi valor de coincidencia esperado reemplazado por ``. ¿Hay un equivalente a\1
cuando se usa la sintaxis de cadena de bash? Editar: se supone que hay un carácter unicode U + 231C en el medio de xxx <U + 231C> xxx.Use una cita específica de Bash que le permite usar cadenas como en C, de modo que se pase un carácter de tabulación real a sed, no una secuencia de escape:
fuente
funciona para mí en OS X y es el mismo comando que uso en Linux todo el tiempo.
fuente
Como se señaló, no todas las
sed
implementaciones admiten la notación\t
como una pestaña horizontal.Puede lograr fácilmente su sustitución con:
Esto realiza un reemplazo in situ que conserva su archivo original como "* .old". Perl permite delimitadores alternativos para el clásico
/
haciendo que la expresión sea mucho más legible (es decir, sin el síndrome del "palillo de dientes inclinado").El
+
dice una o más repeticiones de un carácter de tabulación van a ser sustituidos. Elg
modificador permite reemplazos globales a lo largo del final de cada línea.fuente
También puedes usar
echo
dentrosed
:sed -i "s/$(echo '\t')//g"
fuente
echo '\t'
solo se generará\t
en la implementación de algunos shells deecho
.Si desea una versión más potente
sed
(compatible\t
y más) que la de OS X, instale GNU sed .fuente
sed
es el problema. ¿Tienes alguna razón para creer que ese es el problema? Me encantaría instalar GNU sed si tuviera motivos para creer que resolvería el problema, pero parece que lo he descartado.ruby -pe '$_.gsub!(/\t/," ")' < file.txt
Si está bien requerirlo
bash
ozsh
como un shell, entonces esta es la solución más fácil que se me ocurre:Sin embargo, tenga en cuenta que los
echo
indicadores (-n
y-e
) no están definidos en POSIX, por lo que un shell de conformidad POSIX no requiere comprender estos indicadores, pero muchos lo harán por razones de compatibilidad.fuente
Me sorprende que nadie sugiriera la solución muy simple de:
sed -i.bak -E 's/\\\t/ /' file.txt
Eso debería funcionar.Debe escapar del escape (de ahí los 3 \ s) para permitir que sed comprenda que está tratando de usar un carácter \ t en la expresión regular cuando todo está sustituido ...
fuente
sed
, uno\
es suficiente, ya que no es necesario escapar. El problema es que BSDsed
no admite esta sintaxis para pestañas.Esto funcionó para mí.
sed -e 's / [\ t] / / g'
fuente
sed
. Esto no es lo que usa el OP.