我正在使用OpenWrt和一个非常小的空间.
试图从文件中提取第一行.该行需要进入变量并从文件中删除.我可以使用head将它放入变量但不能使用tail,因为据我所知,我将不得不做尾文件> newFile和我没有空间存放第二个文件.
有人知道一个更好的技术吗?
解决方法:
编辑:您不能使用我的旧答案(见下文)与OpenWrt,因为OpenWrt不附带ed.多可惜.所以这里有两种方法:
vi方式
vi也是一个真正的编辑器,所以以下内容将起作用:
vi -c ':1d' -c ':wq' file > /dev/null
我们用vi打开文件,并使用命令:1d删除第一行,然后:wq保存并退出,将所有输出重定向到/ dev / null.凉爽,干净,简洁.
哦,你当然会跑:
firstline=$(head -n1 file)
在运行此vi命令之前,将文件的第一行放入变量firstline.
注意.在内存很少的系统上,当文件很大时,此方法失败.
dd方式
dd是一个很酷的工具.其他答案中给出的dd方法确实很棒,但它们依赖于openWrt不附带的truncate实用程序.这是一个解决方法:
firstline=$(head -n1 file)
linelength=$(head -n1 file | wc -c)
newsize=$(( $(wc -c < file) - $linelength ))
dd if=file of=file bs=1 skip=$linelength conv=notrunc
dd if=/dev/null of=file bs=1 count=0 seek=$newsize
这将适用于大文件和非常小的内存!最后一个dd命令扮演其他答案中给出的truncate命令的角色.
旧答案是:
您可以使用ed:
firstline=$(printf '%s\n' 1p d wq | ed -s file.txt)
在每次调用时,您将获得变量firstline中文件file.txt的第一行,并从文件中删除此行.