Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de "blancs" dans un script bash

2 réponses
Avatar
nico
Bonjour,

Soit le script bash suivant :

#! /bin/bash

if [ $# -ne 4 ]
then
echo "Usage: ${0##*/} label destination source1 source2" >&2
echo "Copy 'source1' into 'destination', if 'label' is a line of source1
then 'label' is replaced by the content of 'source2'" >&2
exit 1
fi

exec 0< "$3"

echo -n "" > "$2"

while read i
do
if [ "$i" = "$1" ]
then
cat "$4" >> "$2"
else
echo "$i" >> "$2"
fi
done


Il permet de remplacer une ligne 'label' d'un fichier 'source1' par le
contenu du fichier 'source2' et mets le résultat dans 'destination'

Le premier problème : il ne conserve pas les blancs devants les lignes (mais
bon c'est pas dramatique car je l'utilise pour des programme C)

Deuxième problème : il me transforme des lignes comme printf("test\n"); en
printf("testn"); et je ne vois pas trop pourquoi !

Merci d'avance.

Nicolas.

PS: Je ne sais pas si c'est HS ici (mais ce script me permet quand même de
configurer à logiciel à compiler alors pourquoi pas ? ;) et puis ce forum
et tres réactif alors pourquoi s'en priver ? )

2 réponses

Avatar
lhabert
nico :

echo -n "" > "$2"


Tu peux faire « : > "$2" », c'est plus portable. En fait, tu peux carrément
faire « exec > "$2" », et ensuite tu n'as plus aucune redirection à faire.

Le premier problème : il ne conserve pas les blancs devants les lignes (mais
bon c'est pas dramatique car je l'utilise pour des programme C)

Deuxième problème : il me transforme des lignes comme printf("testn"); en
printf("testn"); et je ne vois pas trop pourquoi !


read parse son entrée de deux manières :
- il splitte en champs sur les caractères contenus dans la variable IFS
- sauf quand ils sont précédés d'un «  », qui permet de quoter (et les fins
de lignes aussi).

Pour le première problème, il faut donc faire un « IFS= », et pour le
second, il faut donner l'option « -r » à read.

Avatar
nico
Luc Habert wrote:

nico :

echo -n "" > "$2"


Tu peux faire « : > "$2" », c'est plus portable. En fait, tu peux
carrément faire « exec > "$2" », et ensuite tu n'as plus aucune
redirection à faire.


Je n'y vais pas pensé :/

Le premier problème : il ne conserve pas les blancs devants les lignes
(mais bon c'est pas dramatique car je l'utilise pour des programme C)

Deuxième problème : il me transforme des lignes comme printf("testn");
en printf("testn"); et je ne vois pas trop pourquoi !


read parse son entrée de deux manières :
- il splitte en champs sur les caractères contenus dans la variable IFS
- sauf quand ils sont précédés d'un «  », qui permet de quoter (et les
fins de lignes aussi).

Pour le première problème, il faut donc faire un « IFS= », et pour le
second, il faut donner l'option « -r » à read.


Ok ca marche, merci beaucoup, je me souvenais plus que read séparait
l'entrée en champs.

--
nico