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 行之后的所有行的主要内容,如果未能解决你的问题,请参考以下文章