Je veux exécuter ack ou grep sur des fichiers HTML qui ont souvent de très longues lignes. Je ne veux pas voir de très longues lignes qui s'enroulent à plusieurs reprises. Mais je ne veux voir que la partie d'une longue ligne qui entoure une chaîne qui correspond à l'expression régulière. Comment puis-je obtenir cela en utilisant une combinaison d'outils Unix?
Vous pouvez utiliser l'option grep -o
, éventuellement en combinaison avec la modification de votre modèle en ".{0,10}<original pattern>.{0,10}"
afin de voir un certain contexte autour de lui:
-o, --only-matching Afficher uniquement la partie d'une ligne correspondante qui correspond au MOTIF.
..ou -c
:
-c, --count Supprimer la sortie normale; au lieu de cela, imprimez un nombre de lignes correspondantes pour chaque fichier d'entrée. Avec l'option -v, --invert-match (voir Ci-dessous), comptez les lignes qui ne correspondent pas.
Envoyez vos résultats par cut
. J'envisage également d'ajouter un --cut
basculez pour dire --cut=80
et obtenez seulement 80 colonnes.
Vous pouvez utiliser moins comme pageur pour les longues lignes d'acquittement et de hachage: ack --pager="less -S"
Ceci conserve la longue ligne mais la laisse sur une seule ligne au lieu d'envelopper. Pour voir plus de la ligne, faites défiler vers la gauche/droite en moins avec les touches fléchées.
J'ai la configuration d'alias suivante pour ack pour ce faire:
alias ick='ack -i --pager="less -R -S"'
cut -c 1-100
obtient des caractères de 1 à 100.
L'approche suggérée ".{0,10}<original pattern>.{0,10}"
est parfaitement bon, sauf que la couleur de surbrillance est souvent gâchée. J'ai créé un script avec une sortie similaire mais la couleur est également préservée:
#!/bin/bash
# Usage:
# grepl PATTERN [FILE]
# how many characters around the searching keyword should be shown?
context_length=10
# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1))
grep -E --color=always "$1" $2 |
grep --color=none -oE \
".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
En supposant que le script est enregistré sous grepl
, puis grepl pattern file_with_long_lines
devrait afficher les lignes correspondantes mais avec seulement 10 caractères autour de la chaîne correspondante.