GNU/Linux >> Tutoriels Linux >  >> Linux

sed à insérer lors de la première correspondance uniquement

Vous pouvez en quelque sorte le faire dans GNU sed :

sed '0,/Matched Keyword/s//New Inserted Line\n&/'

Mais ce n'est pas portable. Comme la portabilité est bonne, la voici dans awk :

awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile

Ou, si vous voulez passer une variable à print :

awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile

Ces deux éléments insèrent la ligne de texte avant la première occurrence du mot-clé, sur une ligne à part, selon votre exemple.

N'oubliez pas qu'avec sed et awk, le mot-clé correspondant est une expression régulière, pas seulement un mot-clé.

MISE À JOUR :

Étant donné que cette question est également étiquetée bash, voici une solution simple qui est purement bash et ne nécessite pas sed :

#!/bin/bash

n=0
while read line; do
  if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then
    echo "New Inserted Line"
    n=1
  fi
  echo "$line"
done

En l'état, ceci comme un tuyau. Vous pouvez facilement l'envelopper dans quelque chose qui agit sur les fichiers à la place.


Si vous en voulez un avec sed* :

sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt

*fonctionne uniquement avec GNU sed


Cela pourrait fonctionner pour vous :

sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file

Vous y êtes presque ! Créez simplement une boucle pour lire à partir du Matched Keyword à la fin du fichier.

Après avoir inséré une ligne, le reste du fichier peut être imprimé par :

  1. Présentation d'un espace réservé de boucle :a (ici a est un nom arbitraire).
  2. Imprimez la ligne actuelle et récupérez la suivante dans l'espace du motif avec le n commande.
  3. Rediriger le contrôle en utilisant le ba commande qui est essentiellement un goto au a titulaire de place. La condition de fin de fichier est naturellement prise en charge par le n commande qui met fin à toute autre commande sed si elle essaie de lire au-delà de la fin de fichier.

Avec un peu d'aide de bash, une véritable doublure peut être réalisée :

sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file

Alternative :

sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file

Cela utilise le Matched Keyword comme un drapeau dans l'espace d'attente et une fois qu'il a été défini, tout traitement est réduit en renflouant immédiatement.


Linux
  1. Convertir une chaîne en hexadécimal sur la ligne de commande

  2. unix - nombre de colonnes dans le fichier

  3. grep ne correspond qu'aux lignes d'une plage spécifiée

  4. Comment utiliser sed pour supprimer uniquement les doubles lignes vides ?

  5. sed insérer une ligne avec des espaces sur une ligne spécifique

Renvoyer uniquement la partie d'une ligne après un motif correspondant ?

Afficher tout le fichier jusqu'au match ?

Insertion Sed sur Osx sur une certaine ligne ?

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

sed - insérer une ligne après X lignes après la correspondance

Remplacer Sed multi-lignes