Évitez d’imprimer des sauts de ligne dans un script shell

1
while read pos; do 
     string1=`echo $pos | cut -c 20-38`
     string2="=$pos" 
     string3="$string1 $string2" 
     echo "$string3" 
done < file

C'est le code de mon script. Je souhaite afficher la sortie sur une seule ligne, mais la sortie apparaît sur des lignes différentes. Comment puis-je faire ceci?

ex-pos = abcdefghi1234567890QWERTYUXY.tar.gz chaine1 = 1234567890QWERTYUXY chaine2 = abcdefghi1234567890QWERTYUXY.tar.gz

sortie souhaitée:

1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz

sam
la source
Quel système d'exploitation et quel shell utilisez-vous?
Olli

Réponses:

3

Au début, votre script contient plusieurs fautes de frappe. En dehors de cela, vous pouvez utiliser

echo -n "$string3 "

pour imprimer variable string3, sans ajouter de saut de ligne après cela.

De man echo:

   -n     do not output the trailing newline
Olli
la source
echo - n n'est pas disponible, cela ne fonctionne pas
sam
Si vous utilisez Ubuntu ( askubuntu.com/questions/27705/… ), alors -ndevrait être disponible, sauf si vous utilisez un shell exotique.
Olli
1

vous souhaitez utiliser tr -d '\n'à la fin de l' $string1affectation pour supprimer le saut de ligne présent dans votre fichier:

while read pos; do 
     string1=`echo $pos | cut -c 20-38 | tr -d '\n'`
     string2="=$pos" 
     string3="$string1 $string2" 
     echo "$string3" 
done < file

notez cependant que cela donnera le résultat:

QWERTYUXY.tar.gz =abcdefghi1234567890QWERTYUXY.tar.gz

avec pos = abcdefghi1234567890QWERTYUXY.tar.gzet le script que vous avez donné.

Mortimer
la source
cela fonctionne mais il y a un problème ..... je dois faire une chose de plus que je n'ai pas mentionnée ------ echo "$ string3" >> un fichier qui ne fonctionne pas dans ce cas. La chaîne 1 est affichée sur le terminal et la chaîne 2 sur le fichier_fichier. Je veux que les deux chaînes soient affichées dans 1 fichier dans some_file.
Sam
0

Il y a beaucoup d'options, mais la façon dont je recommanderais est printf.

Il n'imprime pas de nouvelle ligne par défaut, vous devez echodonc printfsupprimer la nouvelle ligne indésirable.

while read pos; do 
    string1=`printf "%s" $pos | cut -c 20-38`
    string2="=$pos" 
    string3="$string1 $string2" 
    printf "%s\n" "$string3" 
done < file

Ou peut-être juste

while read pos; do 
    string1=`printf "%s" $pos | cut -c 20-38`
    string2="=$pos" 
    printf "%s=%s\n" "$string1" "$string2"
done < file

Sortie

1234567890QWERTYUXY=abcdefghi1234567890QWERTYUXY.tar.gz

Cela dit, votre script original fonctionne aussi pour moi. : - /

Sortie

1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz
Mikel
la source