我正在使用 OpenWrt 和非常的空间。
尝试从文件中提取第一行。该行需要进入变量并从文件中删除。我可以使用 head
将其放入变量但不能使用 tail
因为据我所知我必须做 tail file > 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
之前。
注意。在内存很少的系统上,当 file
很大时,此方法会失败。
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
的第一行,并且该行将从文件中删除。
关于Linux:提取文件的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285152/