shell - 获取文件中超过一定行数的所有文本块
问题描述
文本块由空行分隔,例如:
AAA
BBB
AAA'
BBB'
AAA
BBB
CCC
我想获得最后一个超过 2 行的文本块。我知道我可以编写一个 Python 脚本。
我怎样才能通过使用一些命令行来做到这一点?
解决方案
编辑:我想我误解了“获取最后一个文本块”。简单地打印超过 2 行的所有段落:
awk -v RS= -v ORS='\n\n' -F '\n' 'NF>2' file
perl -F'\n' -00e 'print if $#F >= 2' file
awk:
awk -v RS= -F '\n' 'NF>2 {rec=$0} END {if (rec!="") print rec}' file
RS
设置为空值启用“段落模式”。FS
已设置为\n
(因此这NF
将等于每个段落中的行数)。awk 程序保存符合条件的最新记录NF>2
并在最后打印出来。
perl使用类似的想法(除了 perl 对字段数的计算方式不同):
perl -F'\n' -l -00e '$rec=$_ if $#F >= 2; END {print $rec if defined $rec}' file
根据文件的内容,向后读取文件可能会更快,例如tac
:
tac file | perl -F'\n' -l -00e 'if ($#F >= 2) {print $_; exit}' | tac
推荐阅读
- javascript - 如何避免角度 PUT 方法中的 CORS 策略错误
- python - 为什么 Flask 没有从 config 类配置某些环境变量?需要帮助了解配置过程
- php - Stripe API 将一位客户转移到另一位客户
- docker - 如何在 configmap 中设置密码
- python - 如何使用 R 或 python 读取和转换 GrADS 平面二进制格式?
- css - 如何进行背景过渡?
- wordpress - 登录验证在我的帐户页面上不起作用(wordpress)
- html - XPATH 根据上面元素中的名称返回 html 元素的内容
- python - 在 Python spyder 中未在控制台中显示输出
- qt - 为什么启动 QProcess 会冻结 QWidget 子类中的 GUI,但不会冻结 QLineEdit 子类中的 GUI?