Grep या ack द्वारा लौटाई गई लंबी मिलान वाली लाइनों को कैसे छीनना है




unix (4)

मैं HTML फ़ाइलों पर एएके या grep चलाने के लिए चाहता हूं जो अक्सर बहुत लंबी लाइनें होती है। मैं बार-बार लपेटने वाली बहुत लंबी रेखाएं नहीं देखना चाहता हूं। लेकिन मैं एक लंबी रेखा के उस भाग को देखना चाहता हूं जो एक नियमित स्ट्रिंग से मेल खाने वाली स्ट्रिंग से घिरा हुआ हो। यूनिक्स टूल्स के किसी भी संयोजन का उपयोग करके मैं इसे कैसे प्राप्त कर सकता हूं?


आप grep विकल्प -o उपयोग कर सकते हैं, संभवतः अपने पैटर्न को बदलने के संयोजन में ".{0,10}<original pattern>.{0,10}" इसके आसपास कुछ संदर्भ देखने के लिए:

       -o, --only-matching
              Show only the part of a matching line that matches PATTERN.

.. या -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.

से लिया गया: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

सुझाया गया दृष्टिकोण ".{0,10}<original pattern>.{0,10}" पूरी तरह से अच्छा है इसके अलावा हाइलाइटिंग रंग अक्सर गड़बड़ हो जाता है। मैंने एक समान आउटपुट के साथ एक स्क्रिप्ट बनाई है लेकिन रंग भी संरक्षित है:

#!/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))}"

मान लीजिए कि स्क्रिप्ट को grepl रूप में सहेजा गया है, तो grepl pattern file_with_long_lines मिलान रेखाओं को प्रदर्शित करना चाहिए लेकिन मिलान स्ट्रिंग के आस-पास केवल 10 वर्णों के साथ।


cut -c 1-100

1 से 100 के पात्र प्राप्त करता है।


आप एके के लिए पेजर के रूप में कम उपयोग कर सकते हैं और लंबी लाइनों काट सकते हैं: ack --pager="less -S" यह लंबी रेखा को बरकरार रखता है लेकिन इसे लपेटने के बजाय इसे एक पंक्ति पर छोड़ देता है। रेखा के अधिक देखने के लिए, तीर कुंजियों के साथ कम में बाएं / दाएं स्क्रॉल करें।

मेरे पास यह करने के लिए एएके के लिए निम्न उपनाम सेटअप है:

alias ick='ack -i --pager="less -R -S"'