Bash 查找长度超过x个字符的行并截断以显示
我想在HTML文件上运行grep,找出长度超过x个字符的行,并使用grep截断显示 我所知道的 在html文件中找出长度超过100个字符的行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个字符的行,然后将这些
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