Page 1 sur 1

[sed]couper une ligne tous les n mots (résolu)

Publié : dim. 30 sept. 2012, 20:38
par GuilouV
Bonjour,

Je me suis enfin décidé à utiliser conky et j'y ai implémenté une fonction affichant le nombres de mise à jour disponibles ainsi que leurs noms. Par souci d'esthétique j'aimerai que les mises à jour s'affichent à raison de 3 noms par ligne.

Voici la commande qui me permet d'obtenir les noms des mises à jour (et seulement leur nom);

Code : Tout sélectionner

yaourt -Qua | sed ':s;N;s/\n//; s/aur//g; s/core//g; s/extra//g; s/community//g; s/archlinux//g; s/multilib//g; s/[0-9]//g; s/-//g; s/[.]//g; s/://g; s/(basedevel)//g; s/[/]//g;bs' > /tmp/maj
Les noms sont ainsi envoyés dans le fichier /tmp/maj dans lequel ils sont les uns à la suite des autres (sur une seule ligne). J'aimerai, à partir de ce fichier, afficher plusieurs lignes de trois noms chacune.

Pour finir en éclairant mes propos au mieux voici un exemple..
Actuellement, mon fichier /tmp/maj est celui-ci:

Code : Tout sélectionner

ffmpeg libmysqlclient lockdev patch wine xterm conkywx ldlsb
J'aimerai alors obtenir ceci (avec une commande sed ou autre):

Code : Tout sélectionner

ffmpeg libmysqlclient lockdev
patch wine xterm
conkywx ldlsb
Merci

Re: [sed]couper une ligne tous les n mots

Publié : dim. 30 sept. 2012, 21:16
par benjarobin
Déjà en plus propre :

Code : Tout sélectionner

package-query -AQu -f "%n"
Le script complet

Code : Tout sélectionner

#!/bin/bash

cpt=0
package-query -AQu -f "%n" | while read pkg ; do

    if [ $cpt -eq 2 ]; then
        echo "$pkg"
        cpt=0
    else
        printf "%s" "$pkg "
        cpt=$((cpt + 1))
    fi

done

Re: [sed]couper une ligne tous les n mots

Publié : dim. 30 sept. 2012, 21:34
par GuilouV
Super, merci.
J'avais pensé au script mais ne m'y était pas vraiment penché, je cherchais une solution directe avec sed.

En plus je ne connaissais pas la commande package-query -AQu -f "%n" qui est vraiment parfaite ici.

Re: [sed]couper une ligne tous les n mots (résolu)

Publié : dim. 30 sept. 2012, 22:36
par benjarobin
En faite c'est possible avec sed, je n'y avait pas pensé du premier coup

Code : Tout sélectionner

package-query -AQu -f "%n"| tr '\n' ' ' | sed -r "s|([a-zA-Z0-9_-]+) ([a-zA-Z0-9_-]+) ([a-zA-Z0-9_-]+) |\1 \2 \3\n|g"

Re: [sed]couper une ligne tous les n mots (résolu)

Publié : dim. 30 sept. 2012, 22:51
par GuilouV
Magnifique.
Peux-tu juste m'expliquer le fonctionnement de sed dans ce cas pour que je puisse progresser dans son utilisation car je débute avec et j'avoue que je suis un peu perdu sur cette commande spécifique.
Merci.

Re: [sed]couper une ligne tous les n mots (résolu)

Publié : lun. 01 oct. 2012, 00:15
par benjarobin
Ta question est plutôt sur le fonctionnement des regex, rien de spécial ici avec sed : On cherche et capture 3 éléments (entre parenthèse) que l'on affiche grâce à \1, \2 ou \3.
\1 correspond au premier groupe de parenthèse, \2 au 2ième...