Linux: essayer sed

L'exemple suivant en utilisant Linux sed comprend des lignes échantillon d'une base de données des employés du côlon délimité qui a cinq champs: numéro d'identification unique, nom, département, numéro de téléphone et adresse.

1 218: Kris Cottrell: Marketing: 219.555.5555: 123 Principale Street1219: Nate Eichhorn: Ventes: 219.555.5555 1219 Locust Avenue1220: Joe Gunn: Dettes: 317.555.5555: 21974 Unix Way1221: Anne Heltzel: Finances: 219.555.5555: 652 Linux Road1222: John Kuzmic: Ressources humaines: 219.555.5555: 984 Bash Lane

Cette base de données a été en existence depuis le début de la société et a grandi pour inclure tout le monde qui travaille maintenant, ou a déjà travaillé, pour l'entreprise. Un certain nombre de scripts propriétaires lues depuis la base, et la société ne peut pas se permettre d'être sans elle. Le problème est que la compagnie de téléphone a changé le préfixe 219 à 260, de sorte que toutes les entrées dans la base de données ont besoin d'être changé.

Telle est précisément la tâche pour laquelle sed a été créé. Contrairement à la norme (interactifs) éditeurs, un éditeur de flux travaille son chemin à travers un fichier et apporte des modifications sur la base des règles qui lui sont attribués. La règle dans ce cas est de modifier 219 à 260. Il est pas tout à fait aussi simple que cela, cependant, parce que si vous utilisez la commande

sed 's / 219/260 /'

le résultat est pas complètement ce que vous voulez (changements sont en audacieux):

1 218: Kris Cottrell: Marketing:260.555.5555: 123 Principale Street1260Nate: Eichhorn: Ventes: 219.555.5555 1219 Locust Avenue1220: Joe Gunn: Dettes: 317.555.5555:26074 Unix Way1221: Anne Heltzel: Finances:260.555.5555: 652 Linux Road1222: John Kuzmic: Ressources humaines:260.555.5555: 984 Bash Lane

Les changements dans les premier, quatrième, et cinquième lignes sont correctes. Mais dans la deuxième ligne, la première occurrence de 219 apparaît dans le numéro d'identification de l'employé plutôt que dans le numéro de téléphone et a été changé à 260. Si vous vouliez changer plus de la première occurrence dans une ligne, vous pouvez gifler un g (pour mondial) Dans la commande:




's / 219/260 / g' sed

C'est pas ce que vous voulez faire dans ce cas, cependant, parce que le numéro d'identification de l'employé ne devrait pas changer. De même, dans la troisième ligne, une modification a été apportée à l'adresse, car il contient la valeur qui est recherché lucratif aucun changement aurait dû être faite parce que l'employé n'a pas le préfixe téléphonique 219.

La première règle de l'aide sed est d'identifier ce qui rend la localisation de la chaîne que vous cherchez unique. Si le préfixe téléphonique ont été enfermé entre parenthèses, il serait beaucoup plus facile à isoler. Dans cette base de données, cependant, cela ne l'dence la tâche devient un peu plus compliqué.

Si vous avez dit que le préfixe téléphonique doit apparaître au début du champ (noté par un colon), le résultat serait beaucoup plus proche de ce que vous voulez:

's / 219/260 /' sed

Encore une fois, la mise en gras a été ajouté pour montrer les changements:

1 218: Kris Cottrell: Marketing:260.555.5555: 123 Principale Street1219: Nate Eichhorn: Ventes:260.555.5555: 1,219 Locust Avenue1220: Joe Gunn: Dettes: 317.555.5555:26074 Unix Way1221: Anne Heltzel: Finances:260.555.5555: 652 Linux Road1222: John Kuzmic: Ressources humaines:260.555.5555: 984 Bash Lane

La précision a augmenté, mais il reste encore le problème de la troisième ligne. Parce que le colon a aidé à identifier le début de la chaîne, il peut être tentant de se tourner vers la période d'identifier la fin:

sed 's /: 219 ./: 260. /'

Mais le résultat est toujours pas ce qui a été espéré (noter la troisième ligne):

1 218: Kris Cottrell: Marketing:260.555.5555: 123 Principale Street1219: Nate Eichhorn: Ventes:260.555.5555: 1,219 Locust Avenue1220: Joe Gunn: Dettes: 317.555.5555:260.4 Unix Way1221: Anne Heltzel: Finances:260.555.5555: 652 Linux Road1222: John Kuzmic: Ressources humaines:260.555.5555: 984 Bash Lane

Parce que la période a une signification spéciale de tout caractère, une correspondance est trouvée si le 219 est suivie d'une période, d'un 7 ou tout autre caractère unique. Quelle que soit la nature, elle est remplacée par un point. Le côté de remplacement des choses est pas de problèmes la recherche doit être modifié.

En utilisant le caractère , nous pouvons remplacer la signification spéciale de la période et de préciser que vous êtes en effet à la recherche d'une période et non à un seul caractère:

's /: 219 ./: 260. /' sed

Le résultat devient:

1 218: Kris Cottrell: Marketing:260.555.5555: 123 Principale Street1219: Nate Eichhorn: Ventes:260.555.5555: 1,219 Locust Avenue1220: Joe Gunn: Dettes: 317.555.5555: 21974 Unix Way1221: Anne Heltzel: Finances:260.555.5555: 652 Linux Road1222: John Kuzmic: Ressources humaines:260.555.5555: 984 Bash Lane

Et la mission est accomplie.