Bash 查找长度超过x个字符的行并截断以显示

Bash 查找长度超过x个字符的行并截断以显示,bash,unix,awk,grep,Bash,Unix,Awk,Grep,我想在HTML文件上运行grep,找出长度超过x个字符的行,并使用grep截断显示 我所知道的 在html文件中找出长度超过100个字符的行 find . -name '*.html' -print | xargs grep -on '.\{100\}' 查找与标题匹配的行,并将显示限制为40个字符 find . -name '*.html' -print | xargs grep -onE '.{0,40}title.{0,40}' 我不知道的是 如何找出超过100个字符的行,然后将这些

我想在HTML文件上运行grep,找出长度超过x个字符的行,并使用grep截断显示

我所知道的

在html文件中找出长度超过100个字符的行

find . -name '*.html' -print | xargs grep -on '.\{100\}'
查找与标题匹配的行,并将显示限制为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的预期输出


我想第一个grep可以正常工作,所以如果您只想打印40个字符,那么通过管道将其传输到
cut

find . -name '*.html' -print | grep -on '.\{100\}' | cut -c 1-40

我想第一个grep可以正常工作,所以如果您只想打印40个字符,那么通过管道将其传输到
cut

find . -name '*.html' -print | grep -on '.\{100\}' | cut -c 1-40

首先值得一提的是,除非您非常自信可以将“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
进行递归匹配。

首先值得一提的是,除非您非常自信可以将“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
进行递归匹配。

如果出于某种原因您只想使用grep

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

如果出于某种原因,你只想使用grep

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


谢谢,这很有帮助。我想知道是否有一种内置的grep方法不需要管道
切割
?不要这样认为,你要么通过另一个
grep
管道,这样就可以
-o.\{40\}“
或使用
cut
。您可以使用awk进行处理而不查找,但这是另一个完全不同的解决方案。顺便说一句,
grep-n
将在输出中为您提供匹配的行号,因此40个字符不属于行本身,还包括行号和
符号。谢谢是有帮助的。我想知道是否有一种内置的grep方法不需要管道
切割
?不要这样认为,你要么通过另一个
grep
管道,这样就可以
-o.\{40\}“
或使用
cut
。您可以使用awk进行处理而不查找,但这是另一个完全不同的解决方案。顺便说一句,
grep-n
将在输出中为您提供匹配的行号,因此40个字符不属于行本身,还包括行号和
符号。这是定义虽然我不确定您的确切要求是什么,但Awk是可能的-a会有所帮助。几乎,我不确定“预期输出”是否您发布的内容正是您想要的。@TomFenech+++或者如果预期输出正确,请编辑问题,因为预期输出与您所问的内容不同……此外,根据您在当前答案下方的最新评论,HTML中可能有一些换行符(当然,这是完全正确的,并且建议您最好使用理解HTML的工具)。我已经更新了示例,例如,有两个相同的html文件。预期的输出是正确的,标准是查找大于20个字符的行,然后在显示时将行限制为15个字符。虽然我希望15个字符,但不包含文件名和行号,但也可以。这在Aw中绝对是可能的k、 虽然我不确定你的确切要求是什么-a会有帮助。几乎,我不确定“预期输出”是否您发布的内容正是您想要的。@TomFenech+++或者如果预期输出正确,请编辑问题,因为预期输出与您所问的内容不同……此外,根据您在当前答案下方的最新评论,HTML中可能有一些换行符(当然,这是完全正确的,并且建议您最好使用理解HTML的工具)。我已经更新了示例,例如,有两个相同的html文件。预期的输出是正确的,标准是查找大于20个字符的行,然后在显示时将行限制为15个字符。虽然我希望15个字符不包含文件名和行号,但这样就可以了。嗯,查看OPs预期的输出tput-她似乎希望截断包含文件名,因此可能需要添加一个
打印子字符串(文件名):“$0,1,15)
大小写。@Ed yes,尽管在评论中我们有“尽管我希望15个字符不包含文件名和行号”,所以我不知道!是的,我也不知道了,所以我添加了一条评论,要求OP澄清。嗯,看看OP