webentwicklung-frage-antwort-db.com.de

So entfernen Sie Wagenrücklauf und Zeilenvorschub aus einer Variablen im Shell-Skript

Ich bin neu im Shell-Skript. Ich beziehe eine Datei, die in Windows erstellt wurde und mit dem Befehl source Wagenrücklauf ausführt. Nachdem ich, wenn ich einige Zeichen anhebe, quelle, kommt es immer an den Anfang der Zeile.

test.dat (mit Wagenrücklauf am Ende):

testVar=value123

testScript.sh (Quellen oberhalb der Datei):

source test.dat
echo $testVar got it

Die Ausgabe, die ich bekomme, ist

got it23

Wie kann ich den '\r' aus der Variablen entfernen?

19
Mojoy

eine andere Lösung verwendet tr:

echo $testVar | tr -d '\r'
cat myscript | tr -d '\r'

die Option -d steht für delete.

40
Nik O'Lai

Sie können sed wie folgt verwenden:

MY_NEW_VAR=$(echo $testVar | sed -e 's/\r//g')
echo ${MY_NEW_VAR} got it

Versuchen Sie übrigens, einen dos2unix für Ihre Datendatei zu erstellen.

14
Xavier S.

verwenden Sie diesen Befehl für Ihre Skriptdatei, nachdem Sie sie nach Linux/Unix kopiert haben

Perl -pi -e 's/\r//' scriptfilename
5
Vorsprung

Über Pipe to sed -e 's/[\r\n]//g' können Sie sowohl Carriage Returns (\r) als auch Line Feeds (\n) aus jeder Textzeile entfernen.

3
mcandre

für eine reine Shell-Lösung ohne Aufruf eines externen Programms:

NL=$'\n'    # define a variable to reference 'newline'

testVar=${testVar%$NL}    # removes trailing 'NL' from string
1
The O.G. X

Da die Datei, die Sie als Quelle verwenden, Zeilen mit Zeilenumbrüchen endet, sieht der Inhalt von $testVar wahrscheinlich folgendermaßen aus:

$ printf '%q\n' "$testVar"
$'value123\r'

(Der $ der ersten Zeile ist die Shell-Eingabeaufforderung; der $ der zweiten Zeile stammt aus der %q-Formatierungszeichenfolge und gibt $'' quoting an.)

Um den Wagenrücklauf loszuwerden, können Sie die Shell-Parametererweiterung und ANSI-C-Anführungszeichen verwenden (erfordert Bash):

testVar=${testVar//$'\r'}

Was sollte sich ergeben

$ printf '%q\n' "$testVar"
value123
0
Benjamin W.