Le fichier que vous avez montré contient tous les détails sur une seule ligne:
name : farah age : 23 phone number : 0123 education : degree
J'ai supposé que vous pouvez coder age :
en dur, etc. dans la commande, mais le texte qui le suit variera et que les détails peuvent ne pas être dans l'ordre donné ou être contigus.
Vous pouvez extraire des parties de la ligne avec grep
le -o
drapeau de. Cela imprime uniquement la partie correspondante, plutôt que la ligne entière.
Si vous souhaitez inclure les parties age :
et phone number :
, vous pouvez utiliser l' -e
indicateur pour spécifier plusieurs correspondances ou l'alternance.
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
L'expression [^ ]*
signifie n'importe quel nombre de caractères qui ne sont pas un espace, elle correspond donc aux caractères après age :
l'espace suivant.
Remplacez file
par le nom du fichier contenant vos coordonnées. Vous pouvez écrire le nouveau fichier en redirigeant la sortie vers un nouveau fichier avec l' >
opérateur, comme ceci:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
Lorsque vous faites cela, vous ne verrez aucune sortie. Vous devez d'abord vérifier la sortie, puis ajouter la redirection.
Voici l'exemple avec alternance. Nous utilisons le -E
drapeau pour indiquer grep
d'utiliser l'expression régulière étendue. La syntaxe est (pattern1|pattern2)
- cela correspond pattern1
et / ou pattern2
. Si l'un est trouvé, il sera imprimé (que l'autre soit trouvé ou non). J'utilise maintenant +
au moins un des caractères précédents, au lieu de *
zéro ou plusieurs du caractère précédent. Dans ce contexte, ils fonctionnent tous deux aussi bien.
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
Si vous souhaitez omettre les parties age :
et phone number:
, vous pouvez utiliser l' -P
indicateur pour demander grep
d'utiliser des expressions régulières compatibles Perl. Cela prend en charge l'alternance et également un moyen de faire correspondre le texte après un modèle donné:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
Si vous souhaitez formater le texte différemment, vous pouvez utiliser sed
, par exemple:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
Cela dépend du fait de age
venir avant phone number
, alors ajustez en conséquence si ce n'est pas le cas. Si vous ne pouvez pas vous fier à la commande, vous pouvez utiliser cette commande très compliquée:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
Cela réorganise la ligne afin que la phone number :
section vienne en premier sur chaque ligne, puis effectue un deuxième remplacement pour sélectionner les détails souhaités. Je dois la technique utilisée ici à cette réponse de muru .
Notes sur les sed
commandes non couvertes par les explications précédentes
-r
utiliser l'expression régulière étendue pour des commandes plus lisibles (GNU sed
comprend -E
avec la même signification)
s/old/new/
remplacer old
parnew
(pattern)
enregistre pattern
pour référence plus tard, avec \1
ou \2
etc (correspondant à l'ordre de gauche à droite dans lequel les groupes de capture se produisent - notez que cela sed
ne peut en contenir que 7!).
.
n'importe quel caractère, .*
représente donc un nombre quelconque de caractères.
;
sépare les commandes, comme dans le shell.