web-dev-qa-db-fra.com

Comment marquer la chaîne GREP correspondante lors de la redirection de la sortie vers un fichier

J'essaie d'utiliser grep pour rechercher toutes les chaînes correspondantes dans un fichier et les exporter, dans le contexte de la ligne, dans un autre fichier, tout en ajoutant une sorte de marque (idéalement deux astérisques) de chaque côté de la correspondance.

Par exemple, j'ai le fichier input.txt avec le concours suivant:

Dog walks in the park
Man runs in the park
Man walks in the park
Dog runs in the park
Dog is still
They run in the park
Woman runs in the park

Ensuite, je fais une recherche grep avec redirection vers le fichier:

grep -P ' runs? ' input.txt > output.txt

Il crée le fichier output.txt avec le concours suivant:

Man runs in the park
Dog runs in the park
They run in the park
Woman runs in the park

Ce que j'aimerais plutôt faire, c'est obtenir ce résultat:

Man **runs** in the park
Dog **runs** in the park
They **run** in the park
Woman **runs** in the park

Autrement dit, pour chaque correspondance dans le contexte, ajoutez deux astérisques autour de cette correspondance.

Je sais que je ne peux obtenir que des correspondances en ajoutant l'option -o:

grep -P ' runs? ' input.txt > output.txt

mais j'ai besoin de les voir en contexte.

Je sais aussi que je peux mettre en évidence ces matchs en session interactive en lançant ceci:

GREP_OPTIONS='--color=auto'

mais j'utilise grep dans le script bash, il ne m'est d'aucune utilité.

Je me demande donc s'il existe un moyen de marquer ces correspondances dans le fichier de sortie, directement avec grep. Je sais que je pourrais probablement diriger ultérieurement la sortie de grep vers une commande différente pour y parvenir, mais je préférerais utiliser une option de grep. C'est possible? Sinon, quel est le moyen le plus simple d’atteindre le résultat souhaité en combinant grep avec d’autres outils?

3
Rafal

Vous souhaitez utiliser d'autres outils pour effectuer des substitutions, tels que sed:

sed -n 's/ \(runs\?\) / **\1** /p' input.txt > output.txt

Ou Perl:

Perl -ne 's/ (runs?) / **$1** /&&print' input.txt > output.txt
5
kos