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 veux juste voir cette partie d'une longue ligne qui entoure une chaîne qui correspond à l'expression régulière. Comment puis-je l'obtenir en utilisant une combinaison d'outils Unix?Comment tronquer de longues lignes correspondantes renvoyées par grep ou ack
Répondre
Vous pouvez utiliser l'option grep -o
, éventuellement en combinaison avec la modification de votre modèle à ".{0,10}<original pattern>.{0,10}"
afin de voir un peu de contexte autour:
-o, --only-matching Show only the part of a matching line that matches PATTERN.
..ou -c
:
-c, --count Suppress normal output; instead print a count of matching lines for each input file. With the -v, --invert-match option (see below), count non-matching lines.
pipe vos résultats par cut
. J'envisage également d'ajouter un commutateur --cut de sorte que vous pouvez dire --cut = 80 et seulement 80 colonnes.
Que faire si la partie correspondante ne figure pas dans les 80 premiers caractères? – Ether
FWIW J'ai ajouté '' | couper = c1-120' pour le grep, a travaillé pour moi (mais je ne sais pas comment couper autour du texte correspondant) –
'' | cut = c1-120'' ne fonctionnait pas pour moi, je devais faire '' | cut -c1-120'' –
Vous pouvez utiliser moins comme téléavertisseur pour les longues lignes ACK et Hacher: ack --pager="less -S"
Ceci conserve la ligne longue mais la laisse sur une ligne au lieu de l'envelopper. Pour voir plus de la ligne, faites défiler gauche/droite en moins avec les touches fléchées.
J'ai la configuration d'alias suivant pour ack faire ceci:
alias ick='ack -i --pager="less -R -S"'
Veuillez noter que vous pouvez mettre cette commande '--pager' dans votre fichier ~/.ackrc, si vous voulez toujours l'utiliser. –
Cela semble être la meilleure solution de loin à ce problème qui me dérange beaucoup. Je voudrais savoir comment utiliser 'ack'. –
Extrait de: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
L'approche proposée ".{0,10}<original pattern>.{0,10}"
est tout à fait bon, sauf que la couleur de surbrillance est souvent foiré. 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é en tant que grepl
, puis grepl pattern file_with_long_lines
devrait afficher les lignes de correspondance, mais avec seulement 10 caractères autour de la chaîne correspondante.
cut -c 1-100
obtient les caractères de 1 à 100.
- 1. ack-grep: caractères échappés
- 2. Ratio des lignes correspondantes par groupe
- 3. longues lignes d'arithmétique entière
- 4. Un ack ou grep regex pour correspondre à deux lignes, qui sont à peu près la même
- 5. Longues lignes dans LaTeX
- 6. lignes correspondantes sans filtrage (SQL)
- 7. Avoir sed ignorer les lignes non-correspondantes
- 8. Comment puis-je grep ces lignes
- 9. Combinez les lignes correspondantes en utilisant sed ou awk?
- 10. Grep ignore plusieurs lignes
- 11. SQL: Numérotation des lignes renvoyées par une instruction SELECT
- 12. grep ou sed ou awk + correspondance MOT
- 13. Je dois compter les lignes à partir des entrées de fichier de configuration correspondantes, de préférence avec 'grep'
- 14. comment grep entre deux lignes en Perl
- 15. Trouver des lignes correspondantes avec Hadoop/MapReduce
- 16. Habillage de ligne de code - comment gérer les longues lignes
- 17. longues lignes de code vs lisibilité
- 18. grep: exclure les lignes commençant par un caractère vide
- 19. Enveloppez les longues lignes dans Vim?
- 20. Comment supprimer toutes les lignes correspondantes dans un seul tampon?
- 21. Comment faire une correspondance multi-ligne sur les données renvoyées par l'opérateur de diamant de Perl?
- 22. Comment vérifier si datatable contient des lignes correspondantes?
- 23. ack ne fonctionne pas lors de l'exécution de "grep-find" dans Emacs sur Windows
- 24. Comment concaténer les lignes correspondantes dans deux fichiers en Perl?
- 25. Cacher tout (non) les lignes correspondantes dans Vim
- 26. Excel: Remplir une feuille de calcul avec des lignes correspondantes
- 27. Obtenir le nombre de lignes renvoyées par un OleDbDataReader ASP.NET (VB)
- 28. grep
- 29. aligner les lignes correspondantes dans un ensemble d'enregistrements
- 30. Grep (ou peut-être regex) vérifier le motif sur les lignes avant ou après un match
Qu'est-ce 'ack'? Est-ce une commande que vous utilisez lorsque vous n'aimez pas quelque chose? Quelque chose comme 'ack file_with_long_lines | motif de grep'? :-) –
@Alok 'ack' (connu sous le nom de' ack-grep' sur Debian) est 'grep' sur les stéroïdes. Il a aussi l'option '--thpppt' (sans blague). http://betterthangrep.com/ – ZoogieZork
Merci. J'ai appris quelque chose aujourd'hui. –