删除 bash 中某行之后的所有内容

Joh*_*ohn 2 bash text

我想知道是否有办法删除 bash 中文本文件的某一行之后的所有内容。所以说有一个有 10 行的文本文件,我想删除第 4 行之后的每一行,所以只剩下前 4 行,我该怎么做?

Sto*_*ica 6

您可以使用 GNU sed

sed -i '5,$d' file.txt
Run Code Online (Sandbox Code Playgroud)

5,$表示范围第 5 行直到结束,d表示删除。仅保留前 4 行。该-i标志告诉sed就地编辑文件。

如果您只有 BSD sed,则该-i标志需要备份文件后缀:

sed -i.bak '5,$d' file.txt
Run Code Online (Sandbox Code Playgroud)

正如@ephemient指出的那样,虽然这个解决方案很简单,但效率很低,因为它sed仍然会读取输入直到文件结束,这是不必要的。

正如@agc指出的那样,我的第一个提案的逆逻辑实际上可能更直观。也就是说,默认情况下不打印(-n标志),并显式打印 range 1,4

sed -ni.bak 1,4p file.txt
Run Code Online (Sandbox Code Playgroud)

另一个简单的替代方案,假设前 4 行不太长,因此它们很容易放入内存,并且假设第 4 行以换行符结尾,则可以将前 4 行读入内存,然后覆盖文件:

lines=$(head -n 4 file.txt)
echo "$lines" > file.txt
Run Code Online (Sandbox Code Playgroud)