Reemplazar espacios en blanco con pestañas en linux

98

¿Cómo reemplazo los espacios en blanco con pestañas en Linux en un archivo de texto determinado?

biznez
fuente

Respuestas:

168

Utilice el programa inexpand (1)


UNEXPAND(1)                      User Commands                     UNEXPAND(1)

NAME
       unexpand - convert spaces to tabs

SYNOPSIS
       unexpand [OPTION]... [FILE]...

DESCRIPTION
       Convert  blanks in each FILE to tabs, writing to standard output.  With
       no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are  mandatory  for  short  options
       too.

       -a, --all
              convert all blanks, instead of just initial blanks

       --first-only
              convert only leading sequences of blanks (overrides -a)

       -t, --tabs=N
              have tabs N characters apart instead of 8 (enables -a)

       -t, --tabs=LIST
              use comma separated LIST of tab positions (enables -a)

       --help display this help and exit

       --version
              output version information and exit
. . .
STANDARDS
       The expand and unexpand utilities conform to IEEE Std 1003.1-2001
       (``POSIX.1'').
DigitalRoss
fuente
4
Woah, nunca supe que existía expand / unspand. Estaba tratando de hacer lo contrario y expandir fue perfecto en lugar de tener que perder el tiempo con tro sed.
Ibrahim
4
Para el registro, expand / unspand son utilidades estándar .
kojiro
4
Tan genial que estos son estándar. Amo la filosofía UNIX . Sin embargo, sería bueno si pudiera funcionar en su lugar.
Matthew Flaschen
3
No creo que inexpand funcione aquí ... solo convierte los espacios iniciales
olala
13
Solo una advertencia: no expandir no convertirá un solo espacio en una pestaña. Si necesita convertir ciegamente todas las ejecuciones de caracteres 0x20 en una sola pestaña, necesita una herramienta diferente.
Steve S.
44

Creo que puedes intentarlo con awk

awk -v OFS="\t" '$1=$1' file1

o SED si lo prefiere

sed 's/[:blank:]+/,/g' thefile.txt > the_modified_copy.txt

o incluso tr

tr -s '\t' < thefile.txt | tr '\t' ' ' > the_modified_copy.txt

o una versión simplificada de la solución tr sugerida por Sam Bisbee

tr ' ' \\t < someFile > someFile
Jonathan
fuente
4
En su ejemplo de sed, las mejores prácticas dictan que use tr para reemplazar caracteres individuales sobre sed por razones de eficiencia / velocidad. Además, el ejemplo de tr es mucho más fácil de esta manera:tr ' ' \\t < someFile > someFile
Sam Bisbee
2
Por supuesto, tr tiene un mejor rendimiento que sed, pero la principal razón por la que me encanta Unix es que hay muchas formas de hacer algo. Si planeas hacer esta sustitución muchas veces buscarás una solución con buen desempeño, pero si vas a hacerlo una sola vez, buscarás una solución que involucre un comando que te haga sentir cómodo.
Jonathan
2
arg. Tuve que usar prueba y error para que el sed funcionara. No tengo idea de por qué tuve que escapar del signo más de esta manera:ls -l | sed "s/ \+/ /g"
Jess
Con awk -v OFS="\t" '$1=$1' file1Noté que si tiene una línea que comienza con el número 0 (por ejemplo 0 1 2), la línea se omitirá del resultado.
Nikola Novak
@Jess Encontraste una expresión regular de "sintaxis predeterminada correcta". De forma predeterminada, sed trata el signo más simple (sin escape) como un carácter simple. Lo mismo es cierto para algunos otros caracteres como '?', ... Puede encontrar más información aquí: gnu.org/software/sed/manual/html_node/… . Se pueden encontrar detalles de sintaxis similares aquí (tenga en cuenta que esto es man para grep, no sed): gnu.org/software/grep/manual/grep.html#Basic-vs-Extended .
Victor Yarema
11

Usando Perl :

perl -p -i -e 's/ /\t/g' file.txt
John Millikin
fuente
3
Tuve un problema similar al reemplazar espacios consecutivos con una sola pestaña. Perl trabajó funcionó con solo la adición de un '+' a la expresión regular.
Todd
Aunque, por supuesto, quería hacer lo contrario: convertir pestañas en dos espacios:perl -p -i -e 's/\t/ /g' *.java
TimP
¿Puedo hacer esto de forma recursiva?
Aaron Franke
9

mejor comando tr :

tr [:blank:] \\t

Esto limpiará la salida de, digamos, unzip -l , para su posterior procesamiento con grep, cut, etc.

p.ej,

unzip -l some-jars-and-textfiles.zip | tr [:blank:] \\t | cut -f 5 | grep jar
Tarkin
fuente
No tengo que usar comillas para que funcione:tr [:blank:] \\t
Ömer An
3

Descargue y ejecute el siguiente script para convertir de forma recursiva pestañas blandas en pestañas duras en archivos de texto sin formato.

Coloque y ejecute el script desde dentro de la carpeta que contiene los archivos de texto sin formato.

#!/bin/bash

find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
    echo "Converting... "$file"";
    data=$(unexpand --first-only -t 4 "$file");
    rm "$file";
    echo "$data" > "$file";
}; done;
daka
fuente
2

Comando de ejemplo para convertir cada archivo .js en el directorio actual a pestañas (solo se convierten los espacios iniciales):

find . -name "*.js" -exec bash -c 'unexpand -t 4 --first-only "$0" > /tmp/totabbuff && mv /tmp/totabbuff "$0"' {} \;
Arkod
fuente
Probado en cygwin en Windows 7.
Arkod
1

También puede utilizar astyle. Lo encontré bastante útil y también tiene varias opciones:

Tab and Bracket Options:
   If  no  indentation  option is set, the default option of 4 spaces will be used. Equivalent to -s4 --indent=spaces=4.  If no brackets option is set, the
   brackets will not be changed.

   --indent=spaces, --indent=spaces=#, -s, -s#
          Indent using # spaces per indent. Between 1 to 20.  Not specifying # will result in a default of 4 spaces per indent.

   --indent=tab, --indent=tab=#, -t, -t#
          Indent using tab characters, assuming that each tab is # spaces long.  Between 1 and 20. Not specifying # will result in a default assumption  of
          4 spaces per tab.`
Ankur Agarwal
fuente
0

Si está hablando de reemplazar todos los espacios consecutivos en una línea con una tabulación, entonces tr -s '[:blank:]' '\t'.

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda
Device         Start
/dev/sda1       2048
/dev/sda2     411648
/dev/sda3    2508800
/dev/sda4   10639360
/dev/sda5   75307008
/dev/sda6   96278528
/dev/sda7  115809778
[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:blank:]' '\t'
Device  Start
/dev/sda1       2048
/dev/sda2       411648
/dev/sda3       2508800
/dev/sda4       10639360
/dev/sda5       75307008
/dev/sda6       96278528
/dev/sda7       115809778

Si está hablando de reemplazar todos los espacios en blanco (por ejemplo, espacio, tabulación, nueva línea, etc.), entonces tr -s '[:space:]'.

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:space:]' '\t'
Device  Start   /dev/sda1       2048    /dev/sda2       411648  /dev/sda3       2508800 /dev/sda4       10639360        /dev/sda5       75307008        /dev/sda6     96278528        /dev/sda7       115809778  

Si está hablando de reparar un archivo con pestañas dañadas, use expandy unexpandcomo se menciona en otras respuestas.

musaraña
fuente
0

Usando sed :

T=$(printf "\t")
sed "s/[[:blank:]]\+/$T/g"

o

sed "s/[[:space:]]\+/$T/g"
Tibor
fuente
-1

Esto reemplazará los espacios consecutivos con un espacio (pero no tabulación).

tr -s '[:blank:]'

Esto reemplazará los espacios consecutivos con una pestaña.

tr -s '[:blank:]' '\t'
mel
fuente
En realidad, con el -creemplaza los caracteres consecutivos que no son espacios.
wingedsubmariner
1
La pregunta es sobre pestañas, esta no es una respuesta.
Mateo Leer el