2013-02-22 10 views
6

ich ein Unix-Shell-Skript, das macht folgendes:Unix-Skript anhängt^M am Ende jeder Zeile

  1. erstellt eine Sicherungskopie einer Datei
  2. fügt einen Text in einer Datei

Nun in # 2, wenn ich einen Text einfüge, wird^M an alle Zeilen der Datei angehängt.

Zum Beispiel:

echo " a" >> /cust/vivek.txt 
echo " b" >> /cust/vivek.txt 

vi vivek.txt 
abc^M 
bcd^M 
a^M 
b^M 

eine Möglichkeit, dies zu vermeiden?

Danke,

Vivek

+0

zeigen uns, wie der Text durch das Skript angehängt wird –

+3

Datei Haben Sie diese Datei auf Windows-Rechner erstellen und übertragen sie dann auf Unix/Linux-Rechner? Zeilenende wird in MS-DOS- und Linux/Unix-Umgebungen unterschiedlich interpretiert. Unter MS-DOS wird das Ende der Zeile durch ein neues Zeilenzeichen und Wagenrücklauf angezeigt, während unter Unix ein neuer Zeilenvorschub das Ende der Zeile anzeigt. Das verursacht^M Zeichen, wenn Sie nicht über den Übertragungsmodus zwischen MS-DOS und Unix/Linux vorsichtig sind – Incognito

+0

Ich habe die Basisdatei nur von Windows-Maschine kopiert, jetzt eine Möglichkeit, dies zu lösen? –

Antwort

8

Ich bin nicht sicher, wie echo^M Zeichen produzieren sein könnte, aber Sie können sie entfernen, indem dos2unix auf die Dateien, wie diese ausgeführt wird:

dos2unix /cust/vivek.txt 
+0

Vielen Dank, dos2unix hat den Trick gemacht –

+0

Ich wusste nie von dos2unix, arbeitete wie ein Charme für mich! Prost – ConMan

+1

'echo -e" \ r "' produziert solche –

2

Ich vermute, das ein Artefakt Ihrer vi Einstellungen sein kann, anstatt die Verkettung.

Was

tut
cat -v -e filename 

zeigen? Dieser Befehl löscht Ihre Datei und markiert die Steuerzeichen, so dass klar ist, was wirklich in Ihrer Datei ist. Siehe auch this Superuser question/answer set.

+0

-v = benutze^und M-Notation, außer für LFD und TAB; -E = $ am Ende jeder Zeile anzeigen; -e = entspricht -vE; So -v -e = -v -vE; Redundant? Sollten wir nicht nur "-e" anstelle von "-v -e" verwenden? –

3

^M ist ein Wagenrücklauf und wird häufig auf, wenn Dateien gesehen werden von Windows kopiert. Verwenden Sie:

, die eine Low-Level-Liste geben sollte, wie Ihre Datei aussieht. Wenn Ihre Datei nicht von Windows stammt, besteht eine andere Möglichkeit darin, dass Ihre Terminaleinstellungen nicht korrekt übersetzt werden. Überprüfen Sie, ob die Umgebungsvariable TERM korrekt ist.

Wenn die Datei aus dem Windows gekommen ist, dann verwenden dos2unix oder sed 's/\r//' file > file.new

+0

Danke dos2unix geholfen) –

2

^M sind die Meta-Zeichen, die Ihre Datei eingegeben werden, wenn es in den Fenstern verwendet wurde.

Der dos2unix-Befehl kann das beheben.

dos2unix <filename> 
Verwandte Themen