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

问题描述 投票:0回答:3

我想在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
bash unix awk grep
3个回答
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),您可以使用**/*.html在Bash中进行递归匹配。


2
投票

如果由于某种原因你想要使用grep

find . -name '*.html' -exec grep -oP '.{40}(?=.{60})' {} /dev/null \;

0
投票

我想第一个grep工作正常,所以如果你想打印出40个字符,请通过cut管道?

find . -name '*.html' -print | grep -on '.\{100\}' | cut -c 1-40
© www.soinside.com 2019 - 2024. All rights reserved.