Bonjour à tous,
Voici mon soucis, j'ai un fichier sous fc5 et je voudrais par une commande simple supprimer les deux derniers caractères de chaque ligne de mon fichier.
Je vous remercie par avance
Bonjour à tous,
Voici mon soucis, j'ai un fichier sous fc5 et je voudrais par une commande simple supprimer les deux derniers caractères de chaque ligne de mon fichier.
Je vous remercie par avance
Je crois que sed pourra être utile, le tout étant de formaliser une expression régulière englobant les deux derniers caractères d'une ligne.
Pour t'aider, comme d'habitude : man sed et man re_format. Pour la deuxième page, dans le cas où elle ne serait pas dans les man de ta distribution, consulte là ici : http://www.openbsd.org/cgi-bin/man.c...86&format=html
j'aime bien Ruby pour ce genre de snippet :Envoyé par DragVinny
(l'idéal serait de passer la longueur à stripper en argument…)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #!/usr/bin/env ruby begin file = File.new( ARGV[0], "r" ) rescue file = STDIN end while line = file.gets # -3 to take the \n into account... puts line[0,line.length-3] end
Si chaque ligne à une longueur différente tu peux faire :
Si chaque ligne à la même longueur un simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #!/usr/bin/sh while read ligne do longueur=`echo $ligne|wc -m` num=`echo $(( $longueur - 2 ))` echo $ligne|cut -c1-$num >> fic_dest done < test1.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part cut -c-1-$num mon_fichier >> fic_dest
oui cela fonctionnera sans doute aussi,Envoyé par herzleid
mais quand on remarque que echo et cut sont des exécutables à part entière et non des commandes internes du shell…
(/bin/echo et /usr/bin/cut)
on peut s'interroger : lancer 4 process à chaque ligne du fichier source traité : n'est-ce pas un "peu" lourd ?
Faut faire le test. QUi est le plus rapide ? L'appel à echo et à cut ou à l'interpréteur rubis ?
Les paris (troll) sont ouverts. DragVinny oublis pas de précéder les commandes d'un time que l'on puisse avoir la conclusion de ce thriller :p
Ben moi je parie sur sed....Envoyé par herzleid
Ok je prends le paris (j'ai aucun doute surt ta victoire mais je défendrai mon poulain jusqu'au bout)Envoyé par souviron34
Mais pour jour faut fournir le shell. Pas de shell, pas de concour
Je sais je suis sans coeur.
Allez, sed est mon ami :
En plus, c'est court
Code : Sélectionner tout - Visualiser dans une fenêtre à part sed 's/\(.*\)..$/\1/' fichier
encore faudrait-il que l'exemple avec echo et cut fonctionne…Envoyé par herzleid
ce qui n'est pas le cas …
car lorsqu'on traite des fichiers quelconques on peut avoir des lignes dont la longueur est 2 et $num est alors négatif, résultat :
comparaison des 2 sur la partie webapp d'un site web (tous les fichiers php)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cut: [-cf] list: illegal list value
le code Ruby :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 time find . -name "*.php" -exec cutlines.rb -e 2 {} \; > /dev/null real 0m11.065s user 0m6.889s sys 0m3.454s
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 #!/opt/local/bin/ruby require 'optparse' class CatArguments < Hash def initialize(args) super() self[:begin] = 0 self[:end] = 0 self[:reverse] = false opts = OptionParser.new do |opts| opts.banner = "Usage: #$0 [options] [file]\nExamples:\n\t#$0 -e 2 filename\n\tcat filename | #$0 -b 2 -e 2 -r" opts.on('-b', '--begin [INTEGER]', 'number of chars to strip at start of line, default = 0') do |string| self[:begin] = string.to_i || 0 self[:begin] = 0 if self[:begin] < 0 end opts.on('-e', '--end [INTEGER]', 'number of chars to strip at end of line, default = 0') do |string| self[:end] = string.to_i || 2 self[:end] = 0 if self[:end] < 0 end opts.on('-r', '--reverse', 'strip chars between begin to end') do |string| self[:reverse] = true end opts.on_tail('-h', '--help', 'Show help and quits') do puts opts exit 0 end end opts.parse!(args) self[:begin], self[:end] = self[:end], self[:begin] if self[:begin] > self[:end] end end arguments = CatArguments.new(ARGV) begin file = File.new( ARGV[0], "r" ) rescue file = STDIN end b = arguments[:begin] e = arguments[:end] + 1 if arguments[:reverse] while line = file.gets puts line[0..b] + line[line.length-e,e] end else while line = file.gets puts line[b..line.length-e] end enden sed seul
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 time find . -name "*.php" -exec cutlines.sh {} \; > /dev/null euh après plus de 5 min d'attente : CTRL-C ! ^C real 5m44.415s user 0m56.319s sys 4m34.899s
test sur un seul fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 time find . -name "*.php" -exec sed 's/\(.*\)..$/\1/' {} \; > /dev/null real 0m7.126s user 0m5.332s sys 0m1.379s
Ruby
en shell
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 time cutlines.rb -e 2 myprofile.php > /dev/null real 0m0.043s user 0m0.021s sys 0m0.012s
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 time cutlines.sh myprofile.php > /dev/null real 0m13.090s user 0m1.721s sys 0m8.346s
no comment sur l'efficacité de lancer des process sur chaque ligne…
entre sed et Ruby :
le coût du lancement de l'interpréteur Ruby est évidemment visible…
mais on le gardera à portée de main car le script est d'usage plus général…
à noter quand même la particularité des 2 :
si une ligne fait moins de 2 caractères, elle sera recopiée inchangée…
(donc voir si c'est bien cela qui est désiré…)
Envoyé par _Mac_
Jolie. Y a pas à dire il y en as qui ont la classe.
J'avoue que lorsque je faits un script à l'arraché comme ça je vérifie pas si mes fichiers sont non vide, que la ligne contient bien le nb de caractères souhaités etc.. En plus c'etaitjuste pour le jeu. Enfin le fun.Envoyé par JeitEmgie
Enfin c'est bien d'avoir fournis les résultats du concours. Je crois que notre amis DragVinny va pouvoir choisir une solution en toute connaissance de cause, sauf si qq1 veux nous proposer une solution à base de java, python ou autre ^^
Bon ok j'arrete le flood. En tout cas je trouve la solution en sed super courte et facile à retenir.
Comme je dis souvent : sed, c'est bienEnvoyé par herzleid
Fallait la faire, désolé
Merci à tous pour vos renseignement
et une épine dans le pied en moins
j'avais utilisé sed mais j'ma planté dans la cde
merci à tous
Code : Sélectionner tout - Visualiser dans une fenêtre à part sed 's/\(.*\)[][]$/\1/' fichier
et comme dirait _Mac_
"Sed ,c'est bien"
Votre expression sed est compliquée pour rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sed "s#..$##"
Oui, effectivement, y avait encore plus simple
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager