2009-10-05 18 views
10

Ich versuche, das Gegenteil von this question zu tun, Unix-Zeilenendungen mit Windows-Zeilenenden zu ersetzen, so dass ich use SQL Server bcp over samba to import the file. Ich habe sed installiert aber nicht dos2unix. Ich habe versucht, die Beispiele umzukehren, aber ohne Erfolg.Ersetzen Sie n mit r n in Unix-Datei

Hier ist der Befehl, den ich verwende.

sed -e 's/\n/\r\n/g' myfile 

ich ausgeführt dies und lief dann od -c myfile, erwartet \r\n zu sehen, wo \n werden dort verwendet. Aber da alle noch \n. (Oder zumindest scheinen sie zu sein. Die Ausgabe von od überläuft meinen Bildschirm-Puffer, so dass ich den Anfang der Datei nicht sehen kann).

Ich konnte nicht herausfinden, was ich falsch mache. Irgendwelche Vorschläge?

+0

Sie haben keinen Compiler zur Verfügung? –

+0

Welche Art von Compiler? –

+0

, um den Anfang der Datei zu sehen: od -c Dateiname | weniger –

Antwort

11
  • Was ist das Problem mit dos2unix auf die Maschine zu bekommen?
  • Mit welcher Plattform arbeiten Sie?
  • Haben Sie GNU sed oder reguläre nicht-GNU sed?

Unter Solaris /usr/bin/sed erfordert:

sed 's/$/^M/' 

wo ich den '^ M' eingegeben durch SteuerVSteuerM eingeben. Das '$' passt am Ende der Zeile und ersetzt das Ende der Zeile durch das Control-M. Sie können das auch skripten.

Mechanismen, die sed zu erweitern '\r' oder '\\r' zu Control-M erwarten, werden plattformspezifisch, bestenfalls.

+0

Das hat den Trick gemacht. Ich könnte vielleicht dort Dos2unix bekommen, aber ich hoffte, vorhandene Software zu verwenden. Ich bin auf AIX. Ich nehme an, es ist die Nicht-GNU-Version. Jetzt, wo du es erwähnst, habe ich den Kontroll-Trick in vi vorher benutzt, hätte daran denken sollen. Vielen Dank. –

-1

Vielleicht, wenn Sie versuchen es auf diese Weise

cat myfile | sed 's/\n/\r\n/g' > myfile.win 

arbeiten, von meinem Verständnis Ihrer machen nur die Alternativen zu der Konsole ausgegeben, müssen Sie die Ausgabe in eine Datei umleiten, in diesem Fall myfile.win dann könntest du es einfach umbenennen, was immer du willst. Das gesamte Skript wäre (in einem Verzeichnis voll durch diese Art von Dateien):

#!/bin/bash 
for file in $(find . -type f -name '*') 
do 
    cat $file | sed 's/\n/\r\n/g' > $file.new 
    mv -f $file.new $file 
done 
+1

-1. funktioniert nicht für mich. – Peter

+0

gut ist plattformspezifisch, Jonathan Lefflers Antwort ist besser – Juparave

3

Sie die -e Option nicht benötigen.

$ entspricht dem Endzeilenzeichen. Dieser sed Befehl wird ein \r Zeichen vor dem Ende der Zeile einzufügen:

sed 's/$/\r/' myfile 
+1

Danke für den Vorschlag, aber aus irgendeinem Grund klebt dies nur ein r am Ende der Datei. –

+0

Laut dem Info-Handbuch zu GNU sed: "Alle hier vorgestellten Fluchten sind GNU-Erweiterungen, mit Ausnahme von' \ n '. ". – hlovdal

+0

Meine Schuld, weil ich den Unix-Geschmack nicht angegeben habe. Ich benutze AIX. +1, um der Erste zu sein, der darauf hinweist, dass ich nach $ statt nach \ n suchen sollte. –

13

Wenn mit diesem konfrontiert, verwende ich eine einfache perl Einzeiler:

perl -pi -e 's/\n/\r\n/' filename 

weil sed Verhalten ändert sich, und ich weiß, das funktioniert.

+0

Ja, das ist die beste portable Option. Die von Hand eingegebenen^M und unzuverlässigen Erweiterungen oben sind Showstopper. –

1

Nur eine \r Zugabe (aka ^M siehe Antwort Jonathan Leffler) vor \n ist nicht sicher, da die Datei im gemischten Modus EOL haben könnte so dann besteht die Gefahr, landen Sie mit ein paar Zeilen \r\r\n becomming. Die sichere Sache zu tun ist zuerst alle '\ r' Zeichen zu entfernen, und dann (eine einzige) \r vor \n einfügen.

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

Aktualisiert, um ^M zu verwenden.

0

Versuchen Sie es mit:

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

Dies stellt sicher, dass Sie nur einen \ r einfügen, wenn keine \ r dort vor \ n ist. Das hat für mich funktioniert.

Verwandte Themen