我想在HTML文件上运行grep以查找长于x个字符的行,并使用grep截断显示。
我所知道的
找出html文件中超过100个字符的行。
find . -name '*.html' -print | xargs grep -on '.\{100\}'
查找与title
匹配的行,并使用
find . -name '*.html' -print | xargs grep -onE '.{0,40}title.{0,40}'
我不知道
如何查找超过100个字符的行,然后将这些行显示为限制为40个字符?
MVCE
我有一堆html文件,看起来像
$ cat 1.html
abcdefghijklmnopqrstuv12345675689
12345675689abcdefghijklmnopqrstuv
abcd1234
现在,我想查找超过20个字符的行,然后将显示切换为仅15个字符。
期望输出与favoretti solution
$ find . -name '*.html' -print | xargs grep -on '.\{20\}' | cut -c -15
./1.html:1:abcd
./1.html:2:1234
./2.html:1:abcd
./2.html:2:1234
答案 0 :(得分:4)
首先值得一提的是,除非您非常确信可以将“HTML”文件视为一系列行分隔记录,否则您应该使用HTML感知工具(独立的,或者包含在脚本语言中。)
因为您在之前的评论中提到了Awk:
find . -name '*.html' -exec awk '
length($0) > 20 { print FILENAME, substr($0, 1, 15) }' {} +
匹配长度大于20的行并打印前15个字符。我把文件名放在开头,如果你愿意,你可以删除它。
目前尚不清楚是否需要find
进行递归搜索 - 如果没有,那么你可以使用shell生成文件列表:
awk 'length($0) > 20 { print FILENAME, substr($0, 1, 15) }' *.html
启用globstar
(shopt -s globstar
)后,您可以在Bash中使用**/*.html
进行递归匹配。
答案 1 :(得分:2)
如果由于某种原因你只想使用grep
find . -name '*.html' -exec grep -oP '.{40}(?=.{60})' {} /dev/null \;
答案 2 :(得分:0)
我认为第一个grep工作正常,所以如果你想打印出40个字符,请通过cut
管道?
find . -name '*.html' -print | grep -on '.\{100\}' | cut -c 1-40