web-dev-qa-db-fra.com

Comment supprimer un retour à la ligne et une nouvelle ligne d'une variable dans un script Shell

Je suis nouveau dans le script Shell. Je recherche un fichier créé dans Windows et contenant des retours à la ligne, à l'aide de la commande source. Une fois la source ajoutée, lorsque j'y ajoute des caractères, elle commence toujours au début de la ligne.

test.dat (qui a un retour chariot à la fin):

testVar=value123

testScript.sh (sources ci-dessus fichier):

source test.dat
echo $testVar got it

La sortie que je reçois est

got it23

Comment puis-je supprimer le '\r' de la variable?

19
Mojoy

encore une autre solution utilise tr:

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

l'option -d correspond à delete.

40
Nik O'Lai

Vous pouvez utiliser sed comme suit:

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

En passant, essayez de faire un dos2unix sur votre fichier de données.

14
Xavier S.

utilisez cette commande sur votre fichier de script après l'avoir copié sous Linux/Unix

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

Pipe à sed -e 's/[\r\n]//g' pour supprimer les retours chariot (\r) et les sauts de ligne (\n) de chaque ligne de texte.

3
mcandre

pour une solution pure Shell sans appel de programme externe:

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

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

Étant donné que le fichier que vous créez se termine par des retours à la ligne, le contenu de $testVar devrait ressembler à ceci:

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

(La $ de la première ligne est l'invite du shell; la $ de la deuxième ligne est tirée de la chaîne de formatage %q et indique $'' en citant .)

Pour supprimer le retour à la ligne, vous pouvez utiliser Développement des paramètres du shell et Citation ANSI-C (nécessite Bash):

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

Ce qui devrait aboutir à

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