Rechercher : dans
Par :

Script shell bash sur un texte

Dernière réponse le 12 fév 2008 à 23:25:20 niceLP, le 14 mai 2007 à 16:34:27 
 Signaler ce message aux modérateurs

J'ai un exo qui consiste à insérer une ligne en premier argument($1)
cette ligne doit se situer au milieu d'un texte déjà constitué d'un fichier existant , par exemple :

ligne 1
ligne2
nouvelle ligne
ligne 3
ligne4

on doit le faire sans utiliser les commandes sed et awk , en calculant les lignes ; j'ai fait comme ceci mais ça plante

lignes= wc -l $2 | cut -c1

milieu= $(($lignes/ 2))

si vous avez des idées , merci

Configuration: Windows XP
Firefox 1.5.0.11

Meilleures réponses pour « script shell bash sur un texte » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha...
Guide d'utilisation du Shell pour débutant VoirSHELL BASH - GUIDE D'UTILISATION - Niveau Débutant Introduction Appel aux membres CCM II. C'est quoi le shell ? III. Comment accéder à la ligne de commande IV. Les consoles virtuelles Exemple : Accéder à la console 3 depuis l'interface...
Le remplacement de variables en shell Bash Voir=Le remplacement de variables= Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...

1

lami20j, le 14 mai 2007 à 16:38:44

Salut,

tu as le droit d'utiliser head ou tail? lami20j

Répondre à lami20j

2

jipicy, le 14 mai 2007 à 17:54:21

Salut,

[jp@MDK tmpfs]$ cat niceLP.sh
#! /bin/bash

echo "$1" > tmp
milieu=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
split -l "$milieu" bar.txt tmp
cat tmpaa tmp tmpab > fichier
rm -f tmp*

[jp@MDK tmpfs]$ sh niceLP.sh "Ligne introduite" bar.txt

[jp@MDK tmpfs]$ cat fichier
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5
Ligne 6
Ligne introduite
Ligne 7
Ligne 8
Ligne 9
Ligne 10
Ligne 11
Ligne 12
[jp@MDK tmpfs]$ 
Voir le "man split".

;-))

Édit : La soluce à "lami20j" (enfin dans l'esprit je pense) :
#! /bin/bash

milieu=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
head -"$milieu" "$2" > fichier
echo "$1" >> fichier
tail -"$milieu" "$2" >> fichier
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

3

lami20j, le 14 mai 2007 à 19:38:55

Salut,

Édit : La soluce à "lami20j" (enfin dans l'esprit je pense) :
je confirme :-))
Merci. lami20j

Répondre à lami20j

4

niceLP, le 15 mai 2007 à 11:41:48

Oui on peut le faire avec les commandes tail et head , j'ai essayé mais ça ne marche pas , à chaque fois il me supprime les lignes du fichier ( fichier)
pourtant j'ai bien mis les ">>" ; y a t il un pb avec le $milieu ?
merci

Répondre à niceLP

5

jipicy, le 15 mai 2007 à 12:01:28

Copie/Colle ton script, ton fichier de référence et ton fichier de sortie. Merci.
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

niceLP, le 15 mai 2007 à 12:12:59

Voici le script
ligneinsere

#! /bin/bash

centre=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
head -"$centre" "$2" > fichier
echo "$1" >> fichier
tail -"$centre" "$2" >> fichier

execution :
$ sh ligneinsere "ligne au milieu" fichier

resultat
ligne au milieu
ligne au milieu

Répondre à niceLP

7

jipicy, le 15 mai 2007 à 12:27:30

Juste un truc : j'ai l'impression que tu lances ton script sur le fichier même faisant office de fichier de sortie, non ?

Il faut que le fichier où tu vas lire les lignes soit différent du fichier où tu vas écrire la sortie !!!

Peut être ne suis-je pas dans l'exactitude de la chose, dans ce cas là, sorry ;-(
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

niceLP, le 15 mai 2007 à 13:51:31

Ok tu as raison , désolé je prenais le meme fichier d'entrée et de sortie
merci encore

Répondre à niceLP

9

hugnix, le 9 jun 2007 à 19:02:29

Bonjour a tous j'ai le même problème mais je l'ai résolu autrement bon c'est sur c'est quand même plus facile...


head -3 fichier > temp

echo ligne de texte >> temp

tail -3 fichier >> temp

cat temp > fichier

rm temp

cat fichier

j'ai essayé d'analyser la soluce au dessus mais je bloque avec les variables j'ai pas tout compris, wc -l ok, mais aprés..........................

A+

Répondre à hugnix

11

Simon, le 11 jan 2008 à 11:58:00

Quand le nombre de ligne est pair, ca fonctionne par contre quand c'est impair, il efface une ligne.

pour faire un test en plus, je dois utiliser quoi ?

Répondre à Simon

12

hugnix, le 20 jan 2008 à 19:43:53

Salut,
à mon avis, vu que la nombre de ligne est impair, il le coupe bien en deux mais en deux partie inégale 91/2=45,5 ce qui donne 46/45, tu me suis?
Je t'ai trouvé ça, je pense que ça devrait te satisfaire, du moins je l'espère, sinon je peux te pondre un petit script qui peux te permettre de donné la valeur a head et a tail, bon c'est sur si ton fichier 351443134143142346 lignes, prévoit une calculette....

#! /bin/bash

centre1=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
centre2=$(($centre1 +1))
head -"$centre" "$2" > fichier
echo "$1" >> fichier
tail -"$centre2" "$2" >> fichier




Dsl pour le double post jipicy, j'ai voulu l'éditer mais tu m'as devancés de quelque secondes..............

Merci pour eux ;)

Répondre à hugnix

14

makoko, le 6 fév 2008 à 06:09:20

Bonjour,

J'ai le même problème aussi. ta solution est intéressante, mais tu changes le nom du fichier; dans mon exo, on ne doit pas le changer !

Alors je dois encore chercher la solution. je vais voir comment je peux changer ton script.

Mais, bien sûr, si tu peux donner un coup de main, ça peut toujours accélérer les choses!

Merci

Répondre à makoko

15

makoko, le 6 fév 2008 à 08:06:06

Bonjour,

Ce que je voudrais, c'est avec un fichier yo :

eeeee
eeeee
eeeee
eeeee



Insérer au milieu : hello, en sautant une ligne ; cela devrait donner :

eeeee
eeeee
hello
eeeee
eeeee


Or, en essayant les scripts proposés, je n'arrive pas à ce résultat, soit

-dans le script avec, head et tail , des lignes sont ajoutées ; ainsi j'obtiens : cat yo :

eeeee
eeeee
eeeee
eeeee
hello
eeeee
eeeee
eeeee

Autrement dit, il me rajoute des lignes de texte, copies de lignes du texte, au texte

Ou alors, rien ne change dans les deux fichiers : fichier et yo

cat fichier :

eeeee
eeeee
eeeee
eeeee

cat yo

eeeee
eeeee
eeeee
eeeee


Je ne suis pas sorti de l'auberge !

Merci tout de même


ps : scripts de ref.:
---------------------------

#! /bin/bash

centre1=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
centre2=$(($centre1 +1))
head -"$centre" "$2" > fichier
echo "$1" >> fichier
tail -"$centre2" "$2" >> fichier

rem.: centre, n'est pas une variable. Or vous lui demandez une valeur!
fichier, sort yo, et l'insertion 'hello' mais avec des copies de lignes en plus. ce qui fait que l'insertion n'apparait pas au milieu.
------------------------------------

! /bin/bash

echo "$1" > tmp
milieu=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
split -l "$milieu" bar.txt tmp
cat tmpaa tmp tmpab > fichier
rm -f tmp*

rem.: fichier tmpaa,, tmpab, n'existent pas
bar changé par mon fichier

Répondre à makoko

16

makoko, le 6 fév 2008 à 08:30:15

Bonjour,


J'obtiens bien ce que je voudrais avec ce script (logique): sh mo hello yo , mais pas où, il fallait.

#! /bin/bash

milieu=$(expr $(wc -l $2 | cut -d" " -f1) / 2)
head -"$milieu" "$2" > fichier
echo "$1" >> fichier
tail -"$milieu" "$2" >> fichier

cat yo

eeeee
eeeee
eeeee
eeeee


donc, échec, toujours ....

mais sur fichier : cat fichier :

eeeee
eeeee
hello
eeeee
eeeee

je voudrais ce résultat aussi dans yo!

Je ne suis pas au bout du roulot ....

merci

Répondre à makoko

17

makoko, le 6 fév 2008 à 09:06:51

Je l'ai eu !

En partant du script de jipicy (le 2e), que je remercie au passage, plus simple et plus judicieux (le premier, j'ai eu du mal ,avec split!), j'ai demandé à la fin, tout simplement de 'mv fichier yo', et le tour (le tout aussi) était joué!

j'avais enfin, non de dieu ! ce que je voulais :

eeeee
eeeee
hello
eeeee
eeeee


j'aurais du venir sur votre site plus tôt : seul, on a toujours plus de mal, malgré le cours et du matériel qu'on peut trouver ailleurs. Mais c'est dans l'échange "vive et animé", ou en collectif, qu'on avance, en testant les solutions, en les remaniant, en tentant de comprendre leur logique.

j'ai passé la nuit entière là-dessus, mais cette fois, ça y est, j'ai enfin réussi. cela faisait des jours, que j'étais là-dessus, mais tout seul, pas facile, même si on avance un peu, mais pas autant que quand on est épaulé !

Merci à vous, Merci aux contributeurs

Répondre à makoko

18

makoko, le 6 fév 2008 à 16:28:35

Bonjour,

je reviens vers vous, avec un problème, simple, mais je galère un peu ! je débute sérieusement sur unix.

pb : je fais une redirection de 'env' sous unix, donc, je vais avoir : pwd, user, mail, logname, home.

ex. : env > toi

je souhaite sortir (extraire) et afficher, numéro de ligne, ), nom de l'occurence, = , chaque occurrence de user (l'utilisateur qui exécute le script) , de cette façon:

1) pwd=
2) user=
jusqu'à
4) home=

et pouvoir aussi le faire autant de fois, que ces occurrences là, sont contenues dans le fichier : dans le cas, par ex., où je redirige plusieurs fois, env, dans le même fichier, toi.

travail déjà effectué : j'ai essayé par ex. : find / -pwd 'toi' ( pour faire un premier test: décomposer tout pb, en pbs, plus simples), mais, j'ai eu le message d'erreur suivant :
find: invalid predicate `-pwd'

je continue la recherche.

Merci pour votre aide d'avance

Répondre à makoko

19

jipicy, le 6 fév 2008 à 16:49:26

Salut,

Un truc dans ce genre :

$ env | egrep "^(HOME|USER|PWD|SHELL)" | cat -n
     1  SHELL=/bin/bash
     2  USER=jp
     3  PWD=/home/jp/tmpfs
     4  HOME=/home/jp
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy
Collection CommentÇaMarche.net