Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/07/2012, à 15:25

argolance

Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

Bonjour,
Tout est dans  l'intitulé: comment ne remplacer que la dernière (ou la première) occurrence d'un certain motif dans un fichier-liste du genre:

Pierre
François
Joseph
Jean
[...]
Huguette
Chloé
JosephJérôme
Marcel
...

Je voudrais bien remplacer la dernière occurrence de Joseph par Jérôme par exemple.
La commande sed remplace toutes les occurrences...
Quant à awk, du moins la ligne de commande que j'ai trouvée sur le net sensée permettre d'obtenir un tel résultat(?), elle ne semble pas fonctionner. La console renvoie:

awk: cmd. line:1:                 ^ syntax error)

La ligne de commande (je ne sais presque rien de awk):

 awk '/ Joseph / f &&! {sub ("Joseph", "Jérôme"); f = 1} {print}' fichier-liste

Une idée?
Merci de votre attention!

Cordialement.

Dernière modification par argolance (Le 02/07/2012, à 14:28)

Hors ligne

#2 Le 01/07/2012, à 17:13

xavier4811

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

pour la première occurence trouvée a partir de la ligne 0 par exemple:
sed -i '0,/Joseph/ s//Jérôme/' fichier-liste

ou a partir de la ligne 10 seulement
sed -i '10,/Joseph/ s/Joseph/Jérôme/' fichier-liste

Dernière modification par xavier4811 (Le 01/07/2012, à 17:54)

Hors ligne

#3 Le 01/07/2012, à 17:33

Tangram

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

sed -e 's/\(.*\)Joseph/\1Jérôme/' fichier-liste

#4 Le 01/07/2012, à 18:14

xavier4811

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

Tangram a écrit :

sed -e 's/\(.*\)Joseph/\1Jérôme/' fichier-liste

La tu remplace la dernière occurrence de chaque ligne

Hors ligne

#5 Le 01/07/2012, à 23:08

Tangram

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

xavier4811 a écrit :

La tu remplace la dernière occurrence de chaque ligne

Oui, exact. Il faut donc trouver autre chose.

#6 Le 02/07/2012, à 10:24

credenhill

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

hello
avec awk

$ awk -v s="Jèrome" '/Joseph/ {n=NR} {x[NR]=$0} END{x[n]=s;for(l=1;l<=NR;)print x[l++]}'  fichier
Pierre
François
Joseph
Jean
[...]
Huguette
Chloé
Jèrome
Marcel
...
$ 

Hors ligne

#7 Le 02/07/2012, à 10:26

xavier4811

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

sed -i '1!G;h;$!d;0,/Joseph/ s//Jérôme/' fichier-liste
sed -i '1!G;h;$!d' fichier-liste

La première commande inverse le fichier et remplace la première occurrence, la deuxième remet le fichier dans l'ordre.

Hors ligne

#8 Le 02/07/2012, à 10:37

AnsuzPeorth

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

Bjr,
Aller ma petite contrib.
En 2 lignes avec sed .... Pas hyper propre, mais bon ....ca fait le taf smile

n=$(sed -n '/Joseph/=' '/home/fichier' | tail -n1)
sed -i "$n s/Joseph/Jêrome/" '/home/fichier'

Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 02/07/2012, à 11:36

credenhill

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

avec ed

$ echo -e '$\n?Joseph\n.s/.*/Jérome/\nwq\n' | ed -s fichier
$ 
$ cat fichier
Pierre
François
Joseph
Jean
[...]
Huguette
Chloé
Jérome
Marcel
...
$ 

Hors ligne

#10 Le 02/07/2012, à 11:49

xavier4811

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

credenhill a écrit :

avec ed

J'avais pas pensé à ed
donc ça marche aussi avec vi

echo -e 'G\n?Joseph\n:s/.*/Jérôme/1\n:wq\n' | vi fichier-liste

Hors ligne

#11 Le 02/07/2012, à 13:12

argolance

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

Hello,
Merci à tous pour vos réponses.
J'ai demandé évidemment à suivre la discussion, mais je n'ai pas reçu d'avertissement par mail.
Je découvre donc cette avalanche de messages tardivement: avec ce Forum, je suis habitué et ça ne m'étonne plus!
Bon, du coup, j'ai finalement trouvé un truc, mais comme le dit AnsuzPeorth

Pas hyper propre, mais bon ....ça fait le taf

Ce qui complique les choses, c'est que l'exemple que j'ai donné pour poser plus clairement ma question ne comporte pas de caractères spéciaux, comme c'est le cas du fichier sur lequel j'effectue la commande (/etc/xdg/templates/_root_.jwmrc):

[...]
    <Group>
            <Class>ES</Class>
            <Option>layer:12</Option>
            <Option>sticky</Option>
    </Group>

    <Group>
        <Class>LILO</Class>
        <Option>layer:12</Option>
    </Group>

    <Group>
        <Class>2pmount</Class>J
        <Option>sticky</Option>
    </Group>

    <Group>
        <Class>Gaim</Class>
        <Option>sticky</Option>
    </Group>

    <Group>
        <Class>xmms</Class>
        <Option>icon:xmms.xpm</Option>
    </Group>

    <Group>
        <Class>absvolume</Class>
        <Name>absvolume</Name>
        <Option>nolist</Option>
    </Group>

    <Group>
        <Name>xmessage</Name>
        <!-- <Option>icon:info16.xpm</Option> -->
        <Option>notitle</Option>
        <Option>nolist</Option>
    </Group>
[...]

Au départ, la commande sed ne me renvoyait que des erreurs... Ensuite, le texte inséré n'était pas copié au bon endroit mais au milieu d'un groupe. Puis j'ai fini par trouver une vraie usine à gaz, qui "fait le taf" en identifiant la ligne où se trouve la première occurrence du motif  et  où insérer (plutôt que remplacer le motif par un autre) la ligne de substitution (ça va sans doute vous faire sourire parce que c'est énôrme):

#!/bin/sh

#Recalibrer les lignes vides entre les groupes
sed -i -e '/<\/Group>/,/<Group>/ {/^$/d}' /etc/xdg/templates/_root_.jwmrc
sed -i '/<Group>/{x;p;x}' /etc/xdg/templates/_root_.jwmrc

#Récupérer les lignes
while read I; do
echo "$(grep -n '<Group>' )" > /tmp/test_shot
done < /etc/xdg/templates/_root_.jwmrc

#Ne conserver que la première occurrence
while read I; do
sed -i '2d' /tmp/test_shot
done < /tmp/test_shot

#Ne conserver que le numéro de ligne de la première occurrence
VAR="$(cat /tmp/test_shot | cut -d':' -f1)"

#Insérer nouveau groupe
sed -i "$VAR"i"\    <Group>\n        <Class>ES</Class>\n        <Option>layer:12</Option>\n        <Option>sticky</Option>\n    </Group>" /etc/xdg/templates/_root_.jwmrc

Voilà pour le fun.
Il y a sans aucun doute infiniment plus simple mais ça marche comme je veux.
Je n'ai pas encore testé les awk proposés par credenhill...
Ce que je vais faire un peu plus tard, parce que là, il faut que je bosse..:/.

Cordialement.

Dernière modification par argolance (Le 02/07/2012, à 17:33)

Hors ligne

#12 Le 02/07/2012, à 14:27

argolance

Re : Remplacer dernière occurence d'un motif dans un fichier [RESOLU]

Hello,
... A la lumière de ce que propose AnsuzPeorth, j'ai simplifié:

n=$(sed -n '/<Group>/=' '/etc/xdg/templates/_root_.jwmrc' | head -n1)
sed -i "$n s/<Group>/<Group>\n        <Class>ES<\/Class>\n        <Option>layer:12<\/Option>\n        <Option>sticky<\/Option>\n    <\/Group>\n\n    <Group>/" '/etc/xdg/templates/_root_.jwmrc'

Je ne connaissais pas le coup de la "tête" et de la "queue", bien utile en l'occurrence pour simplifier grandement le code.
Bon, ben je pense que ça ira tout à fait bien comme ça...

Merci beaucoup à vous tous.

Cordialement.

Hors ligne