staging.inyokaproject.org

sed - TAB gegen ; ersetzen

Status: Ungelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

rurotil

Anmeldungsdatum:
7. April 2009

Beiträge: 102

Hallo Leute,

ich versuche mit sed ein tab durch ein Semmikolon zu ersetzen.

Das habe ich schon versucht

sed -i "s/space]\+/ /g"

oder

sed -e 's/\t/\n/g'

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Mal angenommen, deine Datei heisst test.txt. Dann kannst Du in der Datei die Ersetzung so vornehmen:

sed -i 's/\t/\;/g' test.txt 

Zum Testen kannst Du ja einfach das -i weg lassen, dann wird die Datei nicht verändert.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Oder mit einfacherer Syntax:

tr '\t' ';'

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 102

Danke damit funktioniert es schon besser. Ich habe eine Spalte bei der ein langer Text drin ist und die macht vermutlich ärger. Kann ich mit sed auch eine Spalte ausschließen? Bzw. sind in der Spalte auch ";" im Text drin. Kann man das auch noch ausschließen?

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

rurotil schrieb:

Bzw. sind in der Spalte auch ";" im Text drin. Kann man das auch noch ausschließen?

Spaetestens dann empfiehlt es sich, Software zu verwenden, die tatsaechlich CSV parst und schreibt. Alles andere ist murks.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

sebix schrieb:

rurotil schrieb:

Bzw. sind in der Spalte auch ";" im Text drin. Kann man das auch noch ausschließen?

Spaetestens dann empfiehlt es sich, Software zu verwenden, die tatsaechlich CSV parst und schreibt. Alles andere ist murks.

awk wäre da mein erster Kandidat, denn damit kann man auch String-Ersetzungen machen.

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 102

sebix schrieb:

rurotil schrieb:

Bzw. sind in der Spalte auch ";" im Text drin. Kann man das auch noch ausschließen?

Spaetestens dann empfiehlt es sich, Software zu verwenden, die tatsaechlich CSV parst und schreibt. Alles andere ist murks.

Ja das merk ich irgendwie auch, habe schon gefühlt 100 sed Befehle versucht......mit Windows Editor funktioniert das aber einwandfrei.

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 102

rklm schrieb:

sebix schrieb:

rurotil schrieb:

Bzw. sind in der Spalte auch ";" im Text drin. Kann man das auch noch ausschließen?

Spaetestens dann empfiehlt es sich, Software zu verwenden, die tatsaechlich CSV parst und schreibt. Alles andere ist murks.

awk wäre da mein erster Kandidat, denn damit kann man auch String-Ersetzungen machen.

ok und wie geht das?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

rurotil schrieb:

rklm schrieb:

awk wäre da mein erster Kandidat, denn damit kann man auch String-Ersetzungen machen.

ok und wie geht das?

Die Funktion heißen sub() und gsub(). Wir müssten ein Beispiel Deiner Eingabe sehen und verstehen, was Du erreichen willst. Ist aber vielleicht besser in einem neuen Thema aufgehoben, weil Du für die Ersetzung von Tab ja schon funktionierende Lösungen bekommen hast.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Oder mit Python3 und einem dedizierten CSV-Parser:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env pyton3
import csv
import sys

with open(
    sys.__stdout__.fileno(),
    mode=sys.__stdout__.mode,
    buffering=1,
    encoding=sys.__stdout__.encoding,
    errors=sys.__stdout__.errors,
    newline='\n',
    closefd=False
) as stdout:

    for arg in sys.argv[1:]:
        with open(arg, newline='') as csvfile:
            reader = csv.reader(csvfile, delimiter='\t', quotechar='"')
            writer = csv.writer(stdout, delimiter=';', quotechar='"')
            for row in reader:
                #row = map(lambda s: s.replace(';', '_'), row)
                writer.writerow(row)

Das würde dann aus

echo -e $(cat <<EOF
foo\tbar\tbaz\tspam;ham\tblah\nEggs and Spam\tEggs; Sausages and Spam\tblah\tfahsel
EOF
) > test.csv 

sowas machen:

$ ./csv_changer.py test.csv
foo;bar;baz;"spam;ham";blah
Eggs and Spam;"sausages; eggs and spam";wutz;sploink

bzw. mit der Zeile 20 im Skript einkommentiert:

$ python csv_changer.py test.csv
foo;bar;baz;spam_ham;blah
Eggs and Spam;Eggs_ Sausages and Spam;blah;fahsel 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Doc_Symbiosis schrieb:

Mal angenommen, deine Datei heisst test.txt. Dann kannst Du in der Datei die Ersetzung so vornehmen:

sed -i 's/\t/\;/g' test.txt 

Zum Testen kannst Du ja einfach das -i weg lassen, dann wird die Datei nicht verändert.

Ja, und wenn man testet stellt man fest, dass das Semikolon keiner Maskierung bedarf:

sed -i 's/\t/;/g' test.txt 

sebix schrieb:

Oder mit einfacherer Syntax:

tr '\t' ';'

Nur kannst Du damit nicht ohne zusätzlicher Gymnastik die Quelldatei überschreiben.

rurotil schrieb:

Danke damit funktioniert es schon besser. Ich habe eine Spalte bei der ein langer Text drin ist

Wie lange? Was soll das ausmachen, Du wandelst Tabs in Semikolons. Wenn vorher schon Semikolons existieren juckt das nicht.

und die macht vermutlich ärger.

Vermutlich nicht.

Kann ich mit sed auch eine Spalte ausschließen? Bzw. sind in der Spalte auch ";" im Text drin. Kann man das auch noch ausschließen?

Du kannst vorab Semikolons maskieren, wenn das Dein Begehr ist:

sed -i 's/;/\\;/g; s/\t/;/g' test.txt 

Keine Ahnung ob Dir das weiterhilft.

Ja das merk ich irgendwie auch, habe schon gefühlt 100 sed Befehle versucht......mit Windows Editor funktioniert das aber einwandfrei.

Wenn die von der Qualität

1
sed -i "s/space]\+/ /g"

waren, bist Du mit 100 noch billig weggekommen.

Die eckige Klammer wurde nie geöffnet. Die Ersetzung enthält kein Semikolon sondern wieder einen Spacecharacter, es werden doppelte eckige Klammern benötigt und zusätzlich ein Paar Doppelpunkte, das man mit Glück an der richtigen Stelle platziert:

1
sed 's/;/\\;/g; s/[[:space:]]/;/g' 

Mit

1
man 7 regex 

kann man nachschlagen, oder man -a regex.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1575

user_unknown schrieb:

Wenn die von der Qualität

1
sed -i "s/space]\+/ /g"

waren, bist Du mit 100 noch billig weggekommen.

Das ist ein wahres Wort!

Die eckige Klammer wurde nie geöffnet. Die Ersetzung enthält kein Semikolon sondern wieder einen Spacecharacter, es werden doppelte eckige Klammern benötigt und zusätzlich ein Paar Doppelpunkte, das man mit Glück an der richtigen Stelle platziert:

1
sed 's/;/\\;/g; s/[[:space:]]/;/g' 

Mit

1
man 7 regex 

kann man nachschlagen, oder man -a regex.

Siehe bitte auch grep (Abschnitt „Listen-bracket-expressions“).

Antworten |