2009-10-24 10 views
11

Ich habe Muster wie untenWie ersetzen Sie Zeilenvorschübe durch Tabulatorzeichen?

hi 
hello 
hallo 
greetings 
salutations 
no more hello for you 

Ich versuche, alle Zeilenumbrüche mit Tab mit dem folgenden Befehl

sed -e "s_/\n_/\t_g" 

aber es funktioniert nicht zu ersetzen.

Könnte jemand bitte helfen? Ich suche eine Lösung in sed/awk.

Antwort

11

nicht sicher ausgeben möchten Sie

# awk -vRS="\n" -vORS="\t" '1' file 
hi  hello hallo greetings  salutations  no more hello for you 
32

Hier tr ist besser, denke ich:

tr "\n" "\t" < newlines 

Wie Nifle in einem Kommentar vorgeschlagen, newlines hier ist der Name der Datei, um den ursprünglichen Text.

Da sed so linienorientiert ist, ist es in einem solchen Fall komplizierter zu verwenden.

+1

+1 Beat mich um 40 Sekunden – Nifle

+0

@Nifle: Auch keine Katze hier, aber wer zählt? :) – Telemachus

+0

Könnte darauf hinweisen, dass 'newlines' ist die Textdatei – Nifle

5

Sie können nicht neue Zeilen auf einer Zeile-für-Zeile-Basis mit sed ersetzen. Sie müssen Zeilen akkumulieren und die Zeilenumbrüche zwischen ersetzen.

text abc\n <- can't replace this one 

text abc\ntext def\n <- you can replace the one after "abc" but not the one at the end 

Dieses sed Skript alle Linien sammelt und beseitigt alle Zeilenumbrüche aber die letzte:

sed -n '1{x;d};${H;x;s/\n/\t/g;p};{H}' 

By the way, Ihr sed Skript sed -e "s_/\n_/\t_g" versucht, alle Schrägstriche durch Zeilenumbrüche gefolgt zu sagen: „ersetzen Schrägstriche gefolgt von Tabs ". Die Unterstriche übernehmen die Funktion der Trennzeichen für den Befehl s, sodass Schrägstriche leichter als Zeichen zum Suchen und Ersetzen verwendet werden können.

6
sed '$!{:a;N;s/\n/\t/;ta}' file 
+1

Könnten Sie bitte auch den Befehl erklären, den Sie verwenden? – Vijay

+0

Wenn es nicht die letzte Zeile ist, holen Sie sich die nächste Zeile mit dem Musterbereich, ersetzen Sie die neue Zeile und verzweigen Sie dann zu: a und machen Sie dasselbe für jede Zeile – ghostdog74

1
paste -s 

es Verketten aller Zeilen jeder einzelnen Eingabedatei in Befehlszeilen Reihenfolge. Das Zeilenumbruchzeichen jeder Zeile mit Ausnahme der letzten Zeile in jeder Eingabedatei wird durch das Registerzeichen ersetzt, sofern nicht anders durch die Option -d angegeben.

0

Sie sind fast da mit Ihrem sed-Skript, würden Sie es einfach ändern müssen:

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

Die \ ist genug für die Flucht, brauchen Sie nicht hinzufügen _ Und Sie müssen Fügen Sie die / vor g am Ende hinzu, um sed wissen zu lassen, dass dies der letzte Teil des Skripts ist.

Verwandte Themen