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

标签 bash scripting sed

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

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

有没有更有效的方法来完成这个?

最佳答案

尝试 tail :

tail -n +2 "$FILE"

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

GNU tailsed 快得多。 tail 在 BSD 上也可用,-n +2 标志在两个工具中是一致的。检查FreeBSDOS X更多手册页。

不过,BSD 版本可能比 sed 慢得多。我想知道他们是怎么做到的; tail 应该只是逐行读取文件,而 sed 会执行相当复杂的操作,包括解释脚本、应用正则表达式等。

注意:您可能会想使用

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

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

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

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

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

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

关于bash - 如何使用 bash/sed 脚本删除文本文件的第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/339483/

相关文章:

linux - 通过参数字符串查找进程

bash - Solaris 10,sed 在第一个 #include 语句之前插入 #include <iostream>

ubuntu - 找不到命令 'ember'

java - 如何在java中使用args构建rerun.sh文件?

bash - 我们如何根据 unix 中的给定日期获取工作日

mysql - 如何将文件系统中的文件导入/导出 MySQL DB?

Git Pre-Commit 使用sed 动态注入(inject)分支名

linux - RHEL 中的 openssl - 在不使用 openssl.cnf 的情况下使用 root 签署客户端证书?

windows - 在 shell 脚本中检测 windows 操作系统版本

regex - 使用 sed 搜索和替换文件中的 ip 地址