Je veux remplacer une ligne dans un fichier à l'aide d'outils Bash comme SED ou AWK. La partie qui rend cela difficile est que la ligne n'est pas unique, alors comment puis-je correspondre?
Je suis sûr que le match par lui-même pourrait être fait d'autre manière, mais je ne connais que la commande suivante pour remplacer les lignes: p> Les profils.txt ressemble à : p> Comment puis-je trouver le Âge: code> ligne pour une personne spécifique et la mise à jour? Les champs de chaque personne peuvent être dans n'importe quel ordre et les gens peuvent aussi. Les gens auront toujours les deux champs, ils sont juste en blanc si inconnu. P> p>
3 Réponses :
Vous pouvez le faire comme ceci dans Il trouvera awk code> pour définir l'âge de
Bob code>
Bob < / Code> et définir
f code> sur true. Le si
f code> est vrai et
Âge code> est trouvé, ajoutez l'âge et la réinitialisation
f code> p> p> p> P>
Théoriquement string bob code> peut être n'importe où i.e. une partie d'un autre nom I.e.
Bobby code> ou même une valeur. De plus,
Âge: code> peut déjà avoir une valeur, pas nécessairement une valeur vide.
@anubhava true, en fonction de l'entrée OP. Le nom peut être corrigé à certains comme ce / ^ bob: $ / code> de son pour correspondre exactement.
@Jotne: Si BOB code> n'a pas d'âge, mais un
Alice code> a un champ d'âge, votre programme définirait alors l'âge d'Alice. Vous devez réinitialiser
f code> pour chaque ligne commencée par un nom qui est pas i> Bob.
@ user1934428 Ce serait une hypothèse que OP pourrait donner plus d'informations sur. Mais comme il y a des champs vides égaux, je suppose que tout est égal. Dans le même temps, pourquoi Bob: pas un champ de champ d'Alice? En raison de l'onglet devant les champs? Ce serait également une hypothèse.
Je l'ai modifié pour utiliser / ^ bob: $ / code> et cela a fonctionné. En outre, dans mon cas, il n'y aura pas d'étudiants sans le champ d'âge que si le fichier n'est corrompu.
Vous pouvez utiliser ce awk code> (en supposant que vous souhaitez modifier
Âge code> pour la personne
BOB code>):
"Joebob" correspondrait à "Bob".
Merci @denniswilliamson, il est corrigé dans le script.
Un SED simpliste code> SCRID:
$: update bob age 14
$: cat profiles.txt
ALICE:
AGE:
GRADE: 70
BOB:
GRADE:
AGE: 14
/ ^ $ étudiant: /, / ^ \ s / {...} code> indique uniquement le code dans le bloc Curly entre les lignes commençant par le nom majuscule de Srudent donné dans la colonne la plus à gauche et tout autre personne non blanche dans la colonne la plus à gauche. C'est une application de blocs sensible.
Il semble que cette solution ne fonctionne pas pour le dernier bloc du fichier, mais je n'ai pas testé cela. Dans mon cas particulier, il y a une "..." à la fin du fichier et les entrées sont ajoutées au-dessus de celle-ci. Votre solution fonctionne parfaitement. Les accessoires pour l'avoir écrit dans le fichier et être une doublure. ;)