So ersetzen Sie mehrere Leerzeichen durch einen Tabulator

So ersetzen Sie mehrere Leerzeichen durch einen Tabulator

Ich habe einige Textdateien, die einige Spalten enthalten, die durch eine unterschiedliche Anzahl von Leerzeichen getrennt sind, aber stattdessen brauche ich einen einzelnen Tabulator als Trennzeichen. Ist das in Bash möglich?

Antwort1

Zum Konvertieren von Sequenzen vonmehr als ein Leerzeichenauf eine Registerkarte, abereinzelne Räume in Ruhe lassen:

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

So tun Sie dies für mehrere Dateien:

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

oder

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

oder

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

Verwenden Sie dieses Formular für MacOS (oder einfach um das Escapen +in Linux zu vermeiden):

sed -E 's/ + /\t/g'

zusammen mit anderen Optionen usw., die Sie aus den obigen Beispielen benötigen.

Antwort2

Wenn Ihr Charakter über mehrere Registerkarten verfügt, können Sie auch Folgendes verwenden tr -s:

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

Zum Beispiel:

my_file.txt | tr -s " "

Alle weißen Flächen werden zu einer.

Antwort3

Mit können Sie sedmehrere Leerzeichen durch einen Tabulator ersetzen:

Beispiel zum Ersetzen eines oder mehrerer Leerzeichen durch einen Tabulator:

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

Antwort4

Die einfachste Antwort, die nur die Verwendung von „only“ verwendet, bashist:

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

Wenn die Anzahl der Spalten unterschiedlich ist, können Sie dies tun, es funktioniert jedoch nur in bash, nicht in sh:

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

z.B

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

erzeugt:

a   b   c
d   e   f
g   h   i

(dazwischen befindet sich jeweils ein Tabulator, der aber schwer zu erkennen ist, wenn ich ihn hier einfüge)

sedSie könnten dies auch mit oder tun tr, beachten Sie jedoch, dass die Behandlung von Leerzeichen am Anfang zu unterschiedlichen Ergebnissen führt.

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

verwandte Informationen