4
votes

Comment remplacer la première occurrence par sed?

J'ai un fichier avec plusieurs noms: je veux remplacer uniquement le premier

sed '0,/pattern/s/pattern/replacement/' filename

sortie pour ne changer que le prénom Martin D'vloper

-  martin:
        name: NEW VALUE!!!
        job: Developer
        skills:
          - python
          - perl
          - pascal
    -  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
          - lisp
          - fortran
          - erlang


5 commentaires

Cela nous facilitera la vie si vous pouviez fournir des échantillons d'entrée et de sortie attendue, veuillez les ajouter dans votre message et nous le faire savoir alors?


Mis à jour avec entrée et sortie


Copie possible de Comment l'utiliser sed pour remplacer uniquement la première occurrence d'un fichier?


J'ai supprimé ma réponse ( sed -z "s / nom: [^ \ n] * / nom: $ NEW_VALUE /" ) car cette question est effectivement un doublon. Ma réponse peut maintenant être trouvée ici .


Si c'est toujours la ligne 2: sed -r '2s / (nom:). * / \ 1 NEW VALUE !!! /' file


3 Réponses :


2
votes

Si vous êtes d'accord avec awk , essayez de suivre.

val="new_vaue"
awk -v value="$val" '/name/ && ++count==1{sub(/name:.*/,"name: "value)} 1'  Input_file

Si vous avez une variable shell et que vous souhaitez ajouter sa valeur à awk puis essayez de suivre.

awk '/name/ && ++count==1{sub(/name:.*/,"name: NEW VALUE!!!")} 1'  Input_file

Si vous souhaitez enregistrer la sortie dans Input_file lui-même, ajoutez > temp_file && mv temp_file Input_file au code ci-dessus.


1 commentaires

@ user1365697, voyez ma 2ème solution où vous pouvez remplacer les valeurs par variable (de shell à awk) et me faire savoir si cela aide.



3
votes

Cela devrait faire ce que vous voulez:

sed -i "0,/name:/{s/name:.*/name: ${NEW_VALUE}/}" ./myFile

Il trouve la première occurrence de name: puis effectue la substitution, qui remplace ' nom: suivi de n'importe quel caractère ' (. * signifie n'importe quelle séquence de caractères ) avec' nom: $ {NEW_VALUE} code > 'où NEW_VALUE est votre variable dynamique de votre exemple.

De man sed

0, adr2

Commencez dans l'état "première adresse correspondante", jusqu'à ce que addr2 soit trouvé. Ce est similaire à 1, addr2, sauf que si addr2 correspond au tout premier ligne d'entrée la forme 0, addr2 sera à la fin de sa plage, alors que la forme 1, addr2 sera toujours au début de sa plage. Cela ne fonctionne que lorsque addr2 est une expression régulière.


3 commentaires

Pouvez-vous l'expliquer?


pourquoi avons-nous besoin du prénom / nom / {?


il devrait être nom: corrigé, il dit essentiellement trouver le prénom: dans le fichier et faire la substitution spécifiée, extrait de l'homme ajouté en réponse



0
votes

Cela pourrait fonctionner pour vous (GNU sed):

sed -z -i 's/\(name:\).*/\1 '"${NEW_VALUE}"'/M' file

Correspondance sur nom: , remplacez la nouvelle valeur puis lisez et imprimez le reste du fichier.

Ou alternative:

sed -i "/\(name:\).*/{s//\1 ${NEW_VALUE}/;:a;n;ba}" ./myFile

NB le drapeau M à la commande de substitution pour restreindre le . * dans une ligne.


0 commentaires