我想匹配一个文本文件除了最后两行以外的其他行
cat xx
1
2
3
4
5
6
7
8
我想匹配1-6,
楼上的答案是标准的解决方案,那么我来提供一种另外的解决方案吧。
在bash 4+
中提供一种内建命令mapfile
,在 bash 官方手册中,是这么解释的:
Read lines from the standard input into the indexed array variable array, or from file descriptor fd if the -u option is supplied.
从标准输入中读取一行数据存入索引数组,或者提供-u 选项,从文件描述符中读取行数据
这里利用 bash 的重定向可以做一些有趣的事,也就是用纯粹的 bash 内建命令解决这个问题。
# 使用 mapfile,利用代码块构建一行命令
mapfile -n 0 line < /path/to/file; echo -e "${line[@]:0:((${#line[@]} -2))}"
这样可以达到head -n -2
命令的效果,但是会说了,这样这么麻烦有什么意义?
使用 bash 的内建命令可以提升处理速度,这里我对两个命令做了测试:
# 一个拥有52行文本的文件
# head 命令
time head -n -3 tmp.txt
# 内建命令
time { mapfile -n 0 line < tmp.txt; printf '%s\n' "${line[@]:0:((${#line[@]} -2))}";} >/dev/null
结果如下:
head 命令随着执行时间会变化,但内建命令总体保持稳定
head -n -2 /path/to/file