递归地删除 N 行并在每个匹配模式的文件中添加 M 行

Delete N lines & prepend M lines in each file matching a pattern, recursively

我正在寻求有关优化以下命令的帮助,但也将其写在这里以供参考,以供将来对任何人有所帮助。

我想遍历当前文件夹中的所有 .swift 个文件,并继续递归处理所有子文件夹中的文件,然后执行:

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

我想出的解决方案受到 this answer 的启发,并得到了 @EdMorton 的认可,但是读取多行文本以从 file 中添加而不是echo 字符串。

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

解决方案

您可以将其复制粘贴到终端中,将 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

改进?

允许 space 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 来启动您的项目。