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
3 Réponses :
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.
@ user1365697, voyez ma 2ème solution où vous pouvez remplacer les valeurs par variable (de shell à awk) et me faire savoir si cela aide.
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.
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
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.
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