Bonjour à tous
J'ai un tableau de type:
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
Les infos sont separées par des tabulations.
comment faire si je ne veut modifier que la troisieme ligne par exemple...?
En bash, awk ou sed bien sur...!!
J'ai bien trouvé des solution "bencale" avec head ou autre...
Mais c'est un peu le bordel...
# avec sed
Posté par Ramón Perez (site web personnel) . Évalué à 7.
sed "3s/info2/plop/" tableau > nouveau_tableau
[^] # Re: avec sed
Posté par kowalsky . Évalué à 3.
pas forcement l'information, je dois savoir ce qu'il y a 'emplacement du tableau...
si je fais:
var=$(sed -n `echo $ligne`,`echo $ligne`p /etc/hosts | awk '{print $2}');
sed "`echo $ligne`s/$var/plop/" /etc/hosts > new_fichiers
ça marche..!!
Bon mon probleme, c'est que certaine des mes variable contiendrons
des slashs et des espaces...
Va falloir que j'echappe tout ça...
[^] # Re: avec sed
Posté par tgl . Évalué à 6.
awk "NR == ${ligne} { \$2 = plop } ; { print \$0 }" ancien_fichier > nouveau_fichier
ls « NR == ${ligne} { \$2 = plop } » va modifier le 2ème champs de la ligne n°$ligne, et le « print \$0 » va afficher les lignes quelles qu'elles soient, modifiées ou non.
[^] # Re: avec sed
Posté par tgl . Évalué à 4.
[^] # Re: avec sed
Posté par Bonnefille Guilhem (site web personnel) . Évalué à 3.
des slashs et des espaces...
Va falloir que j'echappe tout ça...
Absolument pas. Le premier caractère suivant la commande 's' indique le caractere de séparation des arguments de la dite commande.
Ainsi, on pouvoit aussi ecrire :
sed '3s;info2;plop;'
Il faut donc trouver un caractère qui n'apparaitra jamais. Pour cela, le ';' est pas mal car on l'utilise quasiment jamais dans une valeur manipulée par shell du fait de sa nature de séparation.
Par contre, ton code est bien compliqué.
Si je résume, tu veux remplacer la second champ de la nieme ligne ?
Auquel cas il vaut mieux tout faire avec awk :
awk "NR==$ligne"'{$2=plop}' /etc/hosts
Attention, noter le jeux entre double quote et simple quote ainsi que l'absence de blancs entre les deux chaines. Plus classiquement, en échappant cela done :
awk "NR==$ligne"{\$2=$nouvelle}" /etc/hosts
# encore une autre solution
Posté par fearan . Évalué à 3.
{
head -$(( $n - 1 )) fich
echo "la nouvelle ligne"
tail -$(( $(wc -l fich) - $n )) fich
} > fich2
mv fich2 fich
ps : ne pas oublier qu il y a une difference entre $( et $(( $( fait comme les ` mais c'est beaucoup plus facile a imbriquer, l' autre $(( sert a faire des calculs comme avec la commande expr ^^
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.