【问题标题】:OSX & SED - Delete all lines after line 25 in a directory of documentsOSX & SED - 删除文档目录中第 25 行之后的所有行
【发布时间】: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

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

【问题讨论】:

    标签: macos sed


    【解决方案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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 2018-05-23
        相关资源
        最近更新 更多