【问题标题】:Remove last line from all files of a specific extension从特定扩展名的所有文件中删除最后一行
【发布时间】:2020-02-26 19:36:18
【问题描述】:

我在一个目录中有几个具有相同扩展名的文件 .txt。我想从所有 .txt 文件中删除最后一行。

我做的是

find . -type f -name '*.txt' -exec sed '$d' {} \;

这会为每个 .txt 文件将所需的输出从 sed 打印到终端。

我想要的是修改各自的文件。

【问题讨论】:

  • 不,你真的不想那样做。您也许可以使用sed -i(如果您的 sed 支持这种暴行),但您真的不想这样做。
  • 创建一个新目录。使用更改将文件过滤到新目录中的新文件中。尝试使用sed -i 操作大量文件将在大多数情况下起作用。但它会在最糟糕的时刻失败并导致数据丢失。
  • @WilliamPursell 感谢您的回答和警告。它对我有用。干杯!!

标签: unix awk sed find file-processing


【解决方案1】:

你应该在 sed 语句中使用 -i

要对文件进行修改和更改,我们需要在 sed 命令中指定 -i

你的命令应该是这样的

find . -type f -name '*.txt' -exec sed -i '$d' {} \;

但请注意,它会以 .txt 更新所有文件,您将无法恢复,因此请备份重要文件

【讨论】:

    【解决方案2】:

    试试这个:--

    sed  -i '$d' *.txt
    

    “$”用作行号,表示文件中的最后一行。

    “d”用于删除相应的行(本例中为最后一行)。

    “*.txt”用于选择当前目录下所有扩展名为.txt的文件。

    【讨论】:

    • 请在您的回答中描述问题是什么,以及这个 sn-p 将如何解决它,以帮助其他人理解这个答案
    • 我的意思是在你的回答中解释它......你可以随时编辑它!而且我不知道你说的对不对,我在评论队列中看到了这篇文章
    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案3】:

    考虑到使用sed修改大量文件时会丢失数据的风险,这是我在新建子目录后使用的:

    awk 'NR>1 {print last > "./modified/"FILENAME} {last=$0}' *.txt

    这会将所有扩展名为 .txt 的文件过滤到新文件中,并更改名为 modified 的子目录。

    参考:what is the easiest way to remove 1st and last line from file with awk?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      相关资源
      最近更新 更多