【问题标题】:Delete N lines & prepend M lines in each file matching a pattern, recursively递归删除 N 行并在每个匹配模式的文件中添加 M 行
【发布时间】:2019-06-17 14:33:16
【问题描述】:

我正在寻求帮助以优化以下命令,但也将其写在这里以供将来参考。

我想遍历当前文件夹中的所有 .swift 文件并继续递归处理任何和所有子文件夹中的文件,然后执行以下操作:

  1. 删除每个文件中的N(以下7)第一行
  2. 前置,而不是附加,多行,包含否则可能需要转义的字符(例如//)

【问题讨论】:

  • 既然您在这里回答自己的问题(这很好),您应该将答案部分移至实际答案,而不是使其成为问题的一部分。

标签: macos file unix prepend


【解决方案1】:

我想出的解决方案受到this answer 的启发,并且感谢@EdMorton ? 的批准,但读取多行文本以从文件 中添加而不是echoing 字符串.

这可能仅在您的路径中没有空间时才有效。

解决方案

您可以将其复制粘贴到终端中,将8 替换为您要删除的行数,并将~/Desktop/TextToPrepend.txt 替换为您想要添加的内容的文件路径。

find . -name '*.swift' | while IFS= read -r f; do
    cp ~/Desktop/TextToPrepend.txt tmpfile &&
    tail -n +8 "$f" >> tmpfile && 
    mv tmpfile "$f"
done

改进?

如果允许使用空格 n 路径并且不必使用文件,而是使用就地多行解决方案会更好,但我遇到了换行和转义 // 的问题。

用例

我只是用这个来replace the file header for ALL Swift files in an open source iOS Zilliqa wallet called "Zhip"。

Xcode 中文件头的标准是每行都以注释 // 开头。

专业提示

通过将文件IDETemplateMacros.plist 添加为suggested by this guide 来启动您的项目。

【讨论】:

  • @EdMorton 谢谢!我更新了解决方案,你的意思是这样吗?还在使用; do ... done?我是一名 unix 突击队 n00b...
  • 使用内联前置多行文本的解决方案仍然会很有趣,其中包含// chars :)
  • @EdMorton 非常感谢,它工作得非常漂亮,甚至更优雅地使用 tail 那样!
猜你喜欢
  • 2022-10-01
  • 2015-04-02
  • 2012-09-27
  • 2022-11-04
  • 2010-10-06
  • 1970-01-01
  • 2013-02-23
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多