我想在一个非常庞大的文件(~500GB)中编辑第一行和最后一行。怎么会这样?例如,在第一行中我有:
-flag </begin>
我想省略“-flag”。我尝试使用sed(如图所示)编辑第一行,但我没有工作:
sed -i '1s/-flag <begin>/<begin>/g' file.txt
答案 0 :(得分:2)
我想不出你可以就地做到这一点的方式(我有兴趣听一个!)
几乎没有单行,但你可以尝试一下:
# substitute the first line and exit
sed '1s/-flag \(.*\)/\1/;q' file > new
# add the rest of the file (probably quicker than sed)
tail -n +2 file >> new
# cut off the last line of the file
truncate -s $(( $(stat -c "%s" new) - $(tail -n 1 new | wc -c) )) new
# substitute the last line
tail -n 1 file | sed 's/-flag \(.*\)/\1/' >> new
这假设您有一些工具,例如truncate
,并且您可以在shell中进行算术运算(我的shell为bash
)。
truncate -s
通过取总文件大小stat -c "%s"
与最后一行长度(以字节为单位)之间的差异来删除最后一行。
我不确定你要从最后一行删除的是什么,但我认为它与第一行相同(从行的开头删除-flag
)。
欢迎建议修改。
答案 1 :(得分:1)
如果您只想在第一行中删除-flag
(请注意尾随空白):
sed -i '1s/-flag //' file
如果要完全替换第一行的内容,可以发出
sed -i '1s/.*/new first line/' file
要对最后一行做同样的事情(我以此为例,因为你没有说出你想对最后一行做什么),你做
sed -i '$s/.*/new last line/' file
答案 2 :(得分:0)
通常,更改文件的开头需要完全重写文件 - 原因与文件系统工作方式相关的原因有很好的解释here。
但如果您在保持完全相同的长度的同时重写该行,则有一个技巧:就地编辑。
执行此任务的简单命令行工具将是hexedit
在linux上(请参阅其快捷方式there)。它非常快,因为只需要将更改的字节写入磁盘。但是,它要求新行具有相同数量的字符,这并非总是可行。
在OP情况下,将-flag
替换为5&#34;空间&#34;可能就足够了。字符,但其他情况可能更难处理。
答案 3 :(得分:0)
发现sed具有-i选项,可以在适当位置更改文件。 并且可以删除带有标志nd的行号n,第一行为1d。还有最后一行的$ d
删除第一行
sed -i 1d yourfile.txt
删除最后一行
sed -i '$d' yourfile.txt