小编典典

如何使用 bash/sed 脚本删除文本文件的第一行?

all

我需要使用 bash 脚本从一个巨大的文本文件中反复删除第一行。

现在我正在使用sed -i -e "1d" $FILE- 但删除大约需要一分钟。

有没有更有效的方法来实现这一点?


阅读 227

收藏
2022-03-03

共1个答案

小编典典

试试尾巴

tail -n +2 "$FILE"

-n x: 只打印最后x几行。tail -n 5会给你输入的最后 5
行。+符号类型反转参数并tail打印除第一x-1行以外的任何内容。tail -n +1将打印整个文件,tail -n +2除第一行外的所有内容等。

GNUtailsed. tail在 BSD 上也可以使用,并且-n +2标志在两个工具中是一致的。查看FreeBSDOS
X
手册页以获取更多信息。

不过,BSD 版本可能比sed.
我想知道他们是如何做到的;tail应该只逐行读取文件,同时sed执行非常复杂的操作,包括解释脚本、应用正则表达式等。

注意:您可能很想使用

# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"

但这会给你一个 空文件 。原因是重定向 ( >) 发生在tailshell 调用之前:

  1. Shell 截断文件$FILE
  2. 壳牌创建了一个新进程tail
  3. Shell 将tail进程的标准输出重定向到$FILE
  4. tail从现在空的读取$FILE

如果要删除文件中的第一行,应使用:

tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"

&&将确保文件在出现问题时不会被覆盖。

2022-03-03