Rechercher : dans
Par :

Je cale sec avec /sed/

Dernière réponse le 13 jun 2009 à 18:20:02 m4ni4k, le 12 jun 2009 à 20:03:33 
 Signaler ce message aux modérateurs

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

jipicy, le 12 jun 2009 à 20:06:01

Salut,

Et tu veux quoi en sortie ?
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

m4ni4k, le 12 jun 2009 à 20:10:00

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

Répondre à m4ni4k

4

jipicy, le 12 jun 2009 à 20:47:12

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
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

5

jipicy, le 13 jun 2009 à 08:32:09

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
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

m4ni4k, le 13 jun 2009 à 11:05:44

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!

Répondre à m4ni4k

7

jipicy, le 13 jun 2009 à 11:29:14

Alors peut être que "ed" devrait te convenir mieux que "sed" pour une optimisation et quelques atouts (copier/couper/coller/déplacer) que cet utilitaire possède qui ne sont pas implémentés sur "sed" (à mon grand dam ;-( )...

[tmpfs]$ cat plop
a
b
c
d
e
f
g
h
i
10
j
[tmpfs]$ ed -s plop <<< $'$-1m3\n3 s/.*/& = /\n3,4j\n,p'
a
b
c = 10
d
e
f
g
h
i
j
[tmpfs]$
Quant aux quotes, comme le shell (et autres utilitaires comme sed ou awk) réservent quelques surprises, c'est une habitude que j'ai pris et j'y fais particulièrement attention. Il est vrai que pour "sed $=" ça ne sert pas à grand chose, mais c'est aussi une façon pour moi de distinguer la commande de la syntaxe...
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

8

m4ni4k, le 13 jun 2009 à 13:14:44

Je n'ai pas encore suffisamment de recul pour bien concevoir si l'une ou l'autre de ces méthodes est plus appropriées dans le cadre de mon script fétiche d'entrainement.
Il serait assez sage que je m'en tienne aux bon vieux précepte de Donald Knuthhttp://www-cs-faculty.stanford.edu/~knuth/retd.html qui avait particulièrement bien épinglé le fait que "l'optimisation prématurée est la racine de tous les maux en programmation", cependant, même si parfois je réalise que j'ai tendance à mettre un peu trop la charrue avant les boeufs, je trouve ça plutôt sain de prendre l'habitude de compacter son code le plus possible afin d'y gagner à la fois en clarté et en souplesse.
Je pourrais envisager d'utiliser ed dans un pipe, mais j'ai l'impression que ça alourdirait davantage que ça ne faciliterait les choses.

J'aimerais tellement pouvoir tout réaliser avec l'aide d'une seule commande, c'est un vrai défi, et j'espère que tu n'as pas fait dire à sed son dernier mot!
En tous cas, tes exemples méritent clairemment de s'y attarder.
Tes pages dédiées à sedhttp://www.commentcamarche.net/faq/478-sed que j'ai déjà maintes fois parcourues, ne présentent pas de solutions aussi explicites!

Répondre à m4ni4k

9

 jipicy, le 13 jun 2009 à 18:20:02

Je pourrais envisager d'utiliser ed dans un pipe, mais j'ai l'impression que ça alourdirait davantage que ça ne faciliterait les choses.
Je ne vois pas trop dans ce cas précis à quel niveau ça alourdirait plus par rapport à Sed, d'autant plus que la syntaxe est plus simple, plus compacte et plus lisible ;-\

J'aimerais tellement pouvoir tout réaliser avec l'aide d'une seule commande, c'est un vrai défi, et j'espère que tu n'as pas fait dire à sed son dernier mot!
Sur ce cas précis, je pense que oui, du moins à mon niveau. Après il te faudrait voir le channel #sed sur Freenode, y'a pas mal d'expert là-bas...

Tes pages dédiées à sed que j'ai déjà maintes fois parcourues, ne présentent pas de solutions aussi explicites!
Ben disons que je ne peux/pouvais pas prévoir tous les cas possibles et inimaginables. Bien obliger de faire au cas par cas.

De plus je rajouterai que ce genre de script sur lequel tu t'acharnes, c'est un trip propre à celui qui le met en place. On ne peut pas y rentrer aussi à fond que toi, d'autant plus que bien souvent on ne possède pas toutes les pièces du puzzle, on n'a pas non plus toujours les moyens (ou envies) de faire les tests en situation réelle, et, chose primordiale, il faudrait aussi nous mettre à disposition un AVANT => APRÈS histoire qu'on sache exactement ce que tu veux... ;-\

Bonne soirée. $ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

3

m4ni4k, le 12 jun 2009 à 20:16:19

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!

Répondre à m4ni4k