Je cale sec avec /sed/

m4ni4k -  
jipicy Messages postés 41342 Statut Modérateur -
Bonjour,

J'essaye depuis un bon moment de comprendre comment récupérer un ligne pour la réinsérer à un emplacement de mon choix. voici le modèle:
printf "%s\n" a b c d e f g h i j |sed $=|sed -e /^[0-9]/'{h;d}' .... 

Commetn faire, jusquà présent je me suis limité à ça:
printf "%s\n" a b c d e f g h i j |sed $=|sed -e /^[0-9]/'{h;d}' -e 1'{H;g;}'

C'est vraiment frustrant d'être à 2 doigts d'y arriver mais de ne quand même rien capter!

Je remercie d'avance le bon samaritain qui pourra m'extirper cette épine du pied!
Au sens propre comme au figuré parcque j'ai vraiment la sensation de coder comme un pied.
;p

1 réponse

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Et tu veux quoi en sortie ?
0
m4ni4k
 
tout ce qui pourrait me passer par la tête.
Genre, si 10 était la valeur mise en mémoire tampon (que j'aurais récupérer au préalable sur l'avant dernière ligne), j'aimerais qu'il la recale après le c, mais avant le d

a
b
c =10
d
0
m4ni4k
 
C'est toujours pour améliorer un script qui me serr d'entrainement:
#!/bin/bash
A=/archive.ubuntu.com
M=/medibuntu
C="wget -cNrnH -P$A"
H="/log_POOL\\\\\n http:/"
read X
sudo apt-get update
P="apt-get -qq --print-uris install $X"
Q=`$P|sed -n $=`
R=`sed '/^D/!d;s/^Da.*,/# /' /var/lib/apt/lists/*ease|sed :a\;$\!N';s/\n/\\\n/;s/UTC\\\nDescription: /\\t/;ta'`
S=${X// /-}
$P|sed -e "s/'//;s/'.*//"\
 -e "/\\$A\/u/ s#file:#$C -a$A/ubuntu$H#"\
 -e "/\\$A\/m/ s#file:$A$M#$C$M -a$A$M$H/packages.medibuntu.org#"\
 -e "1i#\!/bin/sh\n\n#  Packages amount:\t\t$Q\n\n$R\n"\
 >/tmp/apt-wget_$S.sh && chmod +x /tmp/apt-wget_$S.sh

Tu vois un peu de quoi il s'agit, j'aimerais donc me passer de la variable Q qui doit inutilement refaire un apt-get juste pour compter des lignes!!!!
Je pourrais aussi me passer de la variable P, ce qui ne serais pas plus mal!
voila comme ça tu sais tout!
0
jipicy Messages postés 41342 Statut Modérateur 4 896 > m4ni4k
 
printf "%s\n" a b c d e f g h i j | sed '$='|\
> sed ':z;N;$!bz;s/\(.*c\)\([^0-9]*\)\([0-9]\+\)\n\(.*\)$/\1 = \3\2\4/'
a
b
c = 10
d
e
f
g
h
i
j
;-))
0
jipicy Messages postés 41342 Statut Modérateur 4 896 > m4ni4k
 
Ou encore en utilisant les mémoires tampons :
printf "%s\n" a b c d e f g h i j | sed '$='| sed '
:z
N
/c$/!{
bz
}
x
:a
N
/[0-9]$/!{
ba
}
s/\(.*\)\n\(.*\)/ = \2\1/
H
g
s/\n =/ =/
'
a
b
c = 10
d
e
f
g
h
i
j
;-))
0
m4ni4k > jipicy Messages postés 41342 Statut Modérateur
 
Tout d'abord, un tout grand merci pour ce fulgurant coup de pouce qui réconforte le jeune manchot paumé sur la banquise que je suis.
Ensuite, on peut se dire que j'étais quand même vraiment loin du compte, mais c'est aussi parcque j'espérais utopiquement trouver une méthode plus générique.
C-à-d que je rêverais d'avoir à disposition une fonction cut/insert qui comme je le souhaiterais, effacerais, tout en gardant en mémoire, plus sobrement le contenu de l'avant dernière ligne (puisque le comptage de ligne s'opère de cette façon dans sed, et que je trouvais assez pertinent de tout grouper dans une seule commande); -- une autre petite parenthèse d'ailleurs juste pour dire que j'aurais bien aimé aussi pouvoir identifier l'avant dernière ligne par un truc simple du style ${ -1} -- ; pour ensuite gérer ce contenu (mémoire tampon) de telle manière qu'il puisse être réinjecter où bon nous semble, y compris par le biais de la commande d'insertion.

Un détail, pourquoi tiens-tu absolument à mettre $= entre des 'quotes'?
Personnellement j'ai tendance à éliminer tout ce que j'estime être superflu.
C'est peut-être une erreur, mais je crois que tu dois avoir compris à quel point je militais en faveur des codes minimalistes. c'est presque maladif, peut-être qu'il faudrait plutôt mieux que je me soigne. ;))

En attendant, ça ne m'empêchera pas d'analyser tes propositions sous toutes leurs coutures et de tenter de les adapter dans toutes sortes de situations pour mieux tenter de les maitriser, merci encore!
0