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 19/04/2020, à 16:50

Christophe C

définir une ligne pour y faire un remplacement

1/ Je sais supprimer une ligne avec sed. Par ex la N°5 :

sed -i '5d' test.txt

2/ je sais remplacer un terme sur 1 ligne précise, par ex la 9 :

sed -i '9 {s/toto/titi/g}' test.txt

3/ je sais remplacer toute les lignes où se trouvent une chaine par 1 nouvelle ligne entière :

sed -i -r "/TOTO/c \\TATA TITI TUTU" test.txt

Par contre je ne sais pas faire l'opération N°3 sur une ligne précise (comme au N°2).

Quelqu'un peut-il m'aider ?

J'ai testé différentes variantes sans succès, comme

sed -i -r "9 {/TOTO/c \\TATA TITI TUTU}" test.txt

Dernière modification par Christophe C (Le 19/04/2020, à 16:57)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#2 Le 19/04/2020, à 17:03

kamaris

Re : définir une ligne pour y faire un remplacement

S'il s'agit simplement de remplacer la ligne N par « texte » :

sed 'Nc\texte'

Si maintenant, en plus du numéro de ligne, on veut qu'elle contienne un certain « motif » :

sed 'N{/motif/c\texte
}'

Le passage à la ligne est nécessaire (à ma connaissance) pour signifier à sed la fin de la commande c, et pouvoir mettre l'accolade fermante sans qu'elle soit considérée littéralement.

Hors ligne

#3 Le 19/04/2020, à 17:08

Christophe C

Re : définir une ligne pour y faire un remplacement

@kamaris : oui, c'est ton option 2 dont j'ai besoin. Merci, ça marche.
Par contre il faut un retour à la ligne avant le "}", ce que je ne comprends pas. Sinon cela ne marche pas. c'est bizarre, comme syntaxe.

Bon, en même temps c'est sed smile

Dernière modification par Christophe C (Le 19/04/2020, à 17:10)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#4 Le 19/04/2020, à 17:26

kamaris

Re : définir une ligne pour y faire un remplacement

Eh bien en général, sed accepte comme délimiteur de fin de commande le point-virgule, l'accolade ou le passage à la ligne (ne pas oublier que les petits bouts de programme qu'on passe en général à sed en ligne de commande, ne sont que des cas particuliers d'un « vrai » programme sed, qui se trouve dans un fichier séparé (de même pour awk)).
Dans le cas des commande c, a, ou i, tout ce qui suit le nom de la commande est considéré littéralement (sauf l'éventuel antislash situé immédiatement après), donc le seul délimiteur restant est le passage à la ligne.
D'ailleurs, si on veut inclure le passage à la ligne dans le texte de remplacement, il faut le protéger par un antislash :

sed 'N{/motif/c\texte\

}'

ou bien mettre plus simplement \n :

sed 'N{/motif/c\texte\n
}'

Hors ligne

#5 Le 19/04/2020, à 18:10

Christophe C

Re : définir une ligne pour y faire un remplacement

ok smile


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#6 Le 19/04/2020, à 18:43

marcus68

Re : définir une ligne pour y faire un remplacement

sinon sans retour à la ligne, on peut faire ça :

sed 'Ns/.*motif.*/texte/'

Hors ligne

#7 Le 19/04/2020, à 18:56

kamaris

Re : définir une ligne pour y faire un remplacement

Oui mais ça c'est triché tongue (en fait, ce fil fait un peu suite à celui-ci : ./viewtopic.php?id=2051186)

Hors ligne

#8 Le 19/04/2020, à 19:29

marcus68

Re : définir une ligne pour y faire un remplacement

on est d'accord qu'il vaut mieux utiliser une commande appropriée, mais utiliser qu'une seule ligne peut également avoir des avantages, surtout dans ce genre de cas assez rare.

Hors ligne