Come sostituire più spazi con una scheda


27

Ho alcuni file di testo che contengono alcune colonne separate da un numero diverso di spazi, ma invece ho bisogno di una singola scheda come separatore. È possibile fare in Bash?


Grazie per l'ottimo input, ma ho alcuni spazi singoli all'interno di una colonna, quindi devo evitare di tabulare un singolo spazio. mi dispiace per questo, è l'informazione.
user_unknown

Risposte:


31

Per convertire sequenze di più di uno spazio in una scheda, ma lascia da soli i singoli spazi :

sed 's/ \+ /\t/g' inputfile > outputfile

Per fare questo per un numero di file:

for inputfile in *
do
    sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done

o

for inputfile in *
do
    sed -i.bak 's/ \+ /\t/g' "$inputfile"
done

o

find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;

sed: -e expression #1, char 1: unknown command: `.'
Aaron Franke il

@AaronFranke: quale comando hai provato? Nessuno degli esempi nella mia risposta dovrebbe produrre quell'errore.
In pausa fino a nuovo avviso.

Scusa, avrei dovuto chiarire. L' finduno sul fondo.
Aaron Franke,

@AaronFranke: a GNU sednon piace avere uno spazio prima dell'estensione di backup. Ho modificato la mia risposta. Grazie per la segnalazione.
In pausa fino a nuovo avviso.

7

Se il tuo personaggio è composto da più schede puoi anche usare tr -s:

-s, --squeeze-repeats   replace each input sequence of a repeated character
                        that is listed in SET1 with a single occurrence

Per esempio:

my_file.txt | tr -s " "

Tutti gli spazi bianchi diventeranno uno.


Questo non è ciò che l'OP chiede.
RonJohn,

5

È possibile utilizzare sedper sostituire un numero di spazi con una scheda .:

Esempio per sostituire uno o più spazi con una scheda:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file

L'OP ha affermato che il numero di spazi era variabile , quindi non credo che questa soluzione funzionerà.
Mikel,

@Mikel. Ops. Grazie per la segnalazione. Ho modificato il post per consentire la corrispondenza per spazi variabili.
IvanGoneKrazy il

La risposta più utile qui.
Luís de Sousa,

3

La risposta più semplice usando solo bashè:

while read -r col1 col2 col3 ...; do
    echo -e "$col1\t$col2\t$col3..."
done <file

Se esiste un numero variabile di colonne, puoi farlo, ma funzionerà solo in bash, non sh:

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <file

per esempio

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <<EOF
a b   c
d   e    f
  g h i
EOF

produce:

a   b   c
d   e   f
g   h   i

(c'è una scheda tra ciascuna, ma è difficile vedere quando la incollo qui)

Puoi anche farlo usando sedo tr, ma nota che la gestione degli spazi vuoti all'inizio produce risultati diversi.

sed:

$ sed 's/  */\t/g' << EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

tR:

$ tr -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i


2

Prova il seguente script SED:

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

Dove <TAB> sta premendo il tasto TAB.


0

Questa è una soluzione molto semplice:

    sed -E 's/\s+/\t/g' your_file > new_file

sed funziona sostanzialmente in questo modo (sed 's / old_pattern / new_pattern / g'). In questo caso il vecchio schema è "\ s +" che significa trovare spazio "s" una o più volte "+" e la barra "\" per interpretarlo come espressione regolare.
Il nuovo modello è la scheda "\ t" che è scritta in formato di espressione regolare e la "g" applica la sostituzione a tutte le righe "a livello globale".


1
Ciao e benvenuto su superutente. Dovresti prenderti il ​​tempo per spiegare la tua soluzione. Per qualcuno che non ha familiarità con i sistemi * nix, sed ed espressioni regolari, questo sembra un mucchio di strani personaggi.
Mogget
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.