OSX & SED - 删除文档目录中第 25 行之后的所有行

Posted

技术标签:

【中文标题】OSX & SED - 删除文档目录中第 25 行之后的所有行【英文标题】:OSX & SED - Delete all lines after line 25 in a directory of documents 【发布时间】:2021-11-24 23:05:53 【问题描述】:

我有一个包含数千个 txt 文件的目录。我需要修剪文件,以便删除每个文件中第 25 行之后的每一行。我使用的是 Mac OSX 10.14.6。

我该怎么做?


我做过的尝试

经过研究,我认为 Mac OSX 终端中的 SED 是最好的方法。

This page 给出了如何在 SED 中定位行的示例。所以我认为我需要的 SED 命令是:

sed '1,25!d'

这告诉 SED 删除除第 1 到 25 行之外的所有内容。当我在单个文件上尝试时,它可以工作。

我现在需要扩展它,以便它在文件目录上工作。

This answer 说我可以使用 SED -n 和 -i 标志来做到这一点(它还提到了在 OSX 上不起作用的 -s 标志)。

所以我觉得代码应该是这样的:

sed -n -i '1,25!d' *.txt

但是当我尝试时,我得到了这个错误:

sed: 1: "filename": command a expects \ followed by text

我尝试了其他变体,但似乎都不起作用。

【问题讨论】:

【参考方案1】:

MacOS 使用 BSD sed,而不是 GNU sed:阅读 man sed

-i 选项需要 BSD sed 中的参数。如果您不想要文件的备份副本,则参数为空字符串:

$ seq 50 | tee file1 > file2

$ wc file1 file2
 50  50 141 file1
 50  50 141 file2
100 100 282 total

$ sed -i '' -n '1,25p' file1 file2

$ wc file1 file2
 25  25  66 file1
 25  25  66 file2
 50  50 132 total

【讨论】:

【参考方案2】:

最好使用q 命令而不是d 以加快执行速度,并像这样使用find + xargs 进行管道传输:

cd some_dir
find . -type f -print0 | xargs -0 -n1 sed -i.bak '25q'

【讨论】:

以上是关于OSX & SED - 删除文档目录中第 25 行之后的所有行的主要内容,如果未能解决你的问题,请参考以下文章

IP 地址 & 文档根目录 & URL 中第一个问号?之后的内容

linux怎么显示文件中第几行

sed 插入行命令 OSX

sed简单用法示例

linux 文本处理sed&软件管理

无法在 OSX 中使用 sed 在模式后添加一行文本