【问题标题】:How can I add a trailing newline to files that don't have it?如何向没有它的文件添加尾随换行符?
【发布时间】:2016-10-14 14:47:36
【问题描述】:

我有一个 Git 项目,其中包含很多没有尾随换行符的文件。我想添加尾随换行符而不添加多余的换行符。我该怎么做?

【问题讨论】:

    标签: replace newline


    【解决方案1】:

    我发现使用我通常使用的工具(grepsed)执行此操作非常棘手,但使用标准 shell 命令确实存在一个优雅的解决方案:

    tail -c 1 file.txt | read || echo >> file.txt    
    
    1. tail 输出文件的最后一个字节
    2. read 将一行读入变量。如果指定了 on 变量,则为无操作,但如果 EOF 出现在换行符之前,则以代码 1 退出。
    3. echo 仅在读取失败时运行(即,如果最后一个字符不是换行符),并将换行符附加到 file.txt

    要查找我们要更改的文件,您可以使用find

    find -not -path "./.git/*" -type f -exec sh -c "grep -Iq . {} && (tail -c 1 {} | read || echo >> {})" \;
    
    1. -not -path 不包括 .git/,我们不想搞砸
    2. -type f 将搜索限制为文件
    3. -exec sh -c "..." 需要将包含管道的命令捆绑在一起
    4. grep -Iq . 搜索任何内容 (.),因此是无操作的,但如果文件是二进制文件,则以代码 1 退出
    5. {} 标记find 将插入文件名的位置

    我建议在运行命令之前检查文件列表。通过将echo >> {} 替换为echo {} 来做到这一点:

    find -not -path "./.git/*" -type f -exec sh -c "grep -Iq . {} && (tail -c 1 {} | read || echo {})" \;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2019-10-12
      相关资源
      最近更新 更多