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 tcaracteres. 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 -Ees 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

\ten laseddeclaración conCTRL-V<TAB>dónde<TAB>está la tecla de tabulación y laCTRL-Vtecla de control yvpresionar juntas.Respuestas:
La sintaxis
\tpara 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\tcon tab y en su lugar trata\tcomo una barra invertida seguida det.Hay muchas soluciones, como:
Use un carácter de tabulación literal.
Use
troprintfpara 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
...sedscript (utilizado mediante la-fopción), los caracteres de tabulación literal me parecen la única posibilidad. Al editar esto con vim,set noexpandtabes importante.trté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.txtfunciona 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\1cuando 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
sedimplementaciones admiten la notación\tcomo 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. Elgmodificador permite reemplazos globales a lo largo del final de cada línea.fuente
También puedes usar
echodentrosed:sed -i "s/$(echo '\t')//g"fuente
echo '\t'solo se generará\ten la implementación de algunos shells deecho.Si desea una versión más potente
sed(compatible\ty más) que la de OS X, instale GNU sed .fuente
sedes 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.txtSi está bien requerirlo
bashozshcomo un shell, entonces esta es la solución más fácil que se me ocurre:Sin embargo, tenga en cuenta que los
echoindicadores (-ny-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.txtEso 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 BSDsedno 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.