GNU/Linux >> Tutoriels Linux >  >> Linux

Sed :Insérer le texte après le nième caractère précédant/suivant une chaîne donnée ?

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();'

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;&/"

Linux
  1. Comment insérer du texte avant la première ligne d'un fichier ?

  2. Envelopper le premier caractère d'une chaîne à l'aide de Sed ?

  3. Utiliser Sed pour ajouter un caractère dans la nième position de la chaîne correspondante ?

  4. Supprimer les occurrences de chaîne dans le fichier texte

  5. Comment insérer un texte au début d'un fichier ?

Tutoriel Unix Sed :ajouter, insérer, remplacer et compter les lignes de fichiers

Supprimer les lignes paires ou impaires d'un fichier texte

Insérer plusieurs lignes dans un fichier après le motif spécifié à l'aide d'un script shell

Comment insérer du texte à la 1ère ligne d'un fichier à l'aide de sed ?

remplacer la nième occurrence de chaîne dans chaque ligne d'un fichier texte

Comment placer le curseur après le dernier caractère dans vim ?