Utilisation de sed
, comment insérer du texte après un caractère qui précède (ou suit) une chaîne par N
occurrences. A titre d'exemple, supposons que la ligne de texte à éditer soit la suivante :
command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'
Après avoir trouvé cette ligne dans un fichier texte (peut-être via la chaîne unique command
), je souhaite insérer du texte après le deuxième (N=2) point-virgule avant keyword
(c'est-à-dire le point-virgule séparant les lines
et of
). Je voudrais spécifiquement utiliser sed
dans le but.
En continuant avec cet exemple, la sortie attendue serait :
command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'
où INSERTED_STRING;
(fourni à sed, par exemple via une variable shell) a été inséré à la position souhaitée.
Réponse acceptée :
Je préfère faire simple :
sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'
pour insérer deux champs avant le mot-clé. La solution générale serait
sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"
mais notez que le N
a un offnet de 1 par rapport à votre question :Ici, N=2
signifie avoir deux champs entre l'insertion et le keyword
.
Explication :/command/
sélectionne uniquement les lignes avec la command
, ainsi les autres lignes restent intactes. ([^;]*;\)
correspond à un champ (une séquence de non-points-virgules) comprenant le point-virgule suivant. En le faisant suivre de \{$N\}
le modèle correspond à $N
des champs. Le keyword
suivant complète ceci pour correspondre à keyword
et le $N
champs auparavant. Le modèle de remplacement se compose de la chaîne insérée et de &
, qui est remplacé par tout ce qui correspondait (donc au final, ce n'était pas un remplacement, mais un insert).
Raccourci et plus lisible avec des expressions régulières étendues :
sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"