我想在通常有很长行的HTML文件上运行ack或grep。我不想看到很长的线条反复包裹。但我确实希望看到围绕与正则表达式匹配的字符串的长行的那一部分。如何使用任何Unix工具组合获得此功能?
答案 0 :(得分:72)
您可以使用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.
答案 1 :(得分:38)
通过cut
管道您的搜索结果。我也在考虑添加一个--cut
开关,以便您可以说--cut=80
并且只能获得80列。
答案 2 :(得分:21)
您可以使用less作为ack的寻呼机并切断长行:ack --pager="less -S"
这样可以保留长行,但将其留在一行而不是换行。要查看更多行,请使用箭头键向左/向右滚动。
我为ack设置了以下别名设置:
alias ick='ack -i --pager="less -R -S"'
答案 3 :(得分:4)
cut -c 1-100
获取1到100之间的字符。
答案 4 :(得分:2)
答案 5 :(得分:1)
建议的方法".{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个字符。
答案 6 :(得分:0)
我将以下内容放入了.bashrc
:
grepl() {
$(which grep) --color=always $@ | less -RS
}
然后可以在命令行上将grepl
与grep
一起使用。使用箭头键查看较长线条的尾部。使用q
退出。
说明:
grepl() {
:定义一个新功能,该功能将在每个(新)bash控制台中可用。$(which grep)
:获取grep
的完整路径。 (Ubuntu为grep
定义了一个别名,该别名与grep --color=auto
等效。我们不希望该别名,而是原来的grep
。)--color=always
:为输出着色。 (由于--color=auto
检测到输出已放入管道中并且因此不会着色,因此别名中的grep
无法正常工作。)$@
:将所有给定grepl
函数的参数放在这里。less
:使用less
-R
:显示颜色S
:不要打乱行答案 7 :(得分:0)
这就是我要做的:
function grep () {
tput rmam;
command grep "$@";
tput smam;
}
在我的.bash_profile中,我override grep使其自动在运行tput rmam
之前和之后运行tput smam
,这会禁用自动包装功能,然后重新启用它。
答案 8 :(得分:0)
ag
也可以使用正则表达式,如果您愿意的话:
ag --column -o ".{0,20}error.{0,20}"
答案 9 :(得分:0)
The Silver Searcher (ag) 通过 --width NUM
选项本身支持它。它将用 [...]
替换其余较长的行。
示例(120 个字符后截断):
$ ag --width 120 '@patternfly'
...
1:{"version":3,"file":"react-icons.js","sources":["../../node_modules/@patternfly/ [...]
在 ack3 中,similar feature is planned 但目前尚未实现。