我正在使用OpenWrt和非常少量空间。
尝试从文件中提取第一行。该行需要进入变量并从文件中删除。我可以使用head
将其放入变量但不能使用tail
,因为据我所知,我必须tail file > newFile
而且我没有空间第二个档案。
有人知道是否有更好的技术?
答案 0 :(得分:4)
使用
sed -i -e '1 w /dev/stdout' -e '1d' file
答案 1 :(得分:3)
编辑:您不能使用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)
在每次通话时,您都会在变量file.txt
中获取文件firstline
的第一行,并且该行将从文件中删除。
答案 2 :(得分:2)
显示第一行并将其删除:
head -1 file
sed -i 1d file
但是,这会隐式创建一个临时文件。如本文中关于 sponge的指示,更好的解决方案可能是“In-place” editing of files。
答案 3 :(得分:0)
我不会称之为优雅,但这是一种潜在的方式:
# Find the number of characters in the first line
BYTES=$(head -n 1 file | wc -c)
# Shift all the data in-place
dd if=file of=file bs=1 skip=$BYTES conv=notrunc
# Remove the extra bytes on the end
truncate -s -$BYTES file
答案 4 :(得分:0)
在没有任何临时文件的情况下,没有标准实用程序(dd
除外)来修改文件。
可能有效的解决方案之一是:
LINELENGTH=$(head -1 test.txt | wc -c)
tail -n +2 test.txt | dd of=test.txt conv=notrunc
truncate -s -$LINELENGTH test.txt
有关此主题的讨论,请参阅https://unix.stackexchange.com/a/11074/15241。
<强> 编辑: 强>
首先使用curl下载文件(请参阅注释)。还有另一种选择:
curl URL | sed -e "1w first_line.txt" -e "1d" > rest.txt
firstline=$(cat first_line.txt)
rm first_line.txt
答案 5 :(得分:-2)
如果你有足够的公羊:
contents=$(cat file)
echo "$contents" | sed -n '1 !p' > file
或者,使用ed:
ed file
2,$wq