查找长于x个字符的行并截断显示

时间:2017-12-21 08:33:13

标签: bash unix awk grep

我想在HTML文件上运行grep以查找长于x个字符的行,并使用grep截断显示。

我所知道的

找出html文件中超过100个字符的行。

find . -name '*.html' -print | xargs grep -on '.\{100\}'

查找与title匹配的行,并使用

将显示限制为40个字符
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

3 个答案:

答案 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

启用globstarshopt -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