在多个文件中以特定行递归方式添加文本

在多个文件中以特定行递归方式添加文本

我想在目录中的所有 html 文件的第二行添加 {% load static %}

这是我的文件夹结构。

 ├── fullstack
│   └── index.html
├── git
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   └── git.html
├── home.html
├── html_css
│   ├── 10.html
│   ├── 11.html
│   ├── 12.html
│   ├── 13.html
│   ├── 14.html
│   ├── 15.html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   ├── 6.html
│   ├── 7.html
│   ├── 8.html
│   ├── 9.html
│   └── html-css.html
├── javascript
│   ├── 10.html
│   ├── 11.html
│   ├── 12.html
│   ├── 13.html
│   ├── 14.html
│   ├── 15.html
│   ├── 16.html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   ├── 6.html
│   ├── 7.html
│   ├── 8.html
│   ├── 9.html
│   └── javascript.html
└── projects
    ├── facebook_project
    │   ├── 10.html
    │   ├── 11.html
    │   ├── 12.html
    │   ├── 13.html
    │   ├── 14.html
    │   ├── 15.html
    │   ├── 1.html
    │   ├── 2.html
    │   ├── 3.html
    │   ├── 4.html
    │   ├── 5.html
    │   ├── 6.html
    │   ├── 7.html
    │   ├── 8.html
    │   ├── 9.html
    │   └── facebook-project.html
    ├── one_mac_project
    │   ├── 10.html
    │   ├── 11.html
    │   ├── 1.html
    │   ├── 2.html
    │   ├── 3.html
    │   ├── 4.html
    │   ├── 5.html
    │   ├── 6.html
    │   ├── 7.html
    │   ├── 8.html
    │   ├── 9.html
    │   └── one-mac-project.html
    └── projects.html

答案1

这是一个常见的常见问题解答。

find . -type f -name '*.html' -exec sed -i '2s/^/{% load static %}/' {} \;

并非所有sed变体都支持-i,有些(特别是 *BSD,包括 MacOS)需要为选项提供一个空参数,例如sed -i '' '2s/...

地址表达式2与第二行匹配,正则表达式^与行首匹配;所以我们说“用第二行的这段文本替换行首的空字符串”。

我显然将“添加到第二行”解释为在行的现有内容之前插入此静态新文本。您还可以执行其他操作,例如插入新行,或替换现有内容,或在行的当前内容之后插入新的静态文本。所有这些都很容易用 完成sed,但语法在不同平台上可能略有不同。

如果您根本没有,sed -i那么也许可以考虑使用 Perl。

find ... -exec perl -i -pe 's/^/{% load static %}/ if $. == 2; $. = 0 if eof' {} +

简而言之,就是对所有符合 中的谓词的文件find ... -exec x {} +执行。和之间的区别在于前者将运行尽可能少的实例;所以x...+\;

x foundfile1.html path/to/foundfile2.html another/foundfile3.html ...

而当\;您为每个文件运行一个实例时:

x foundfile1.html
x path/to/foundfile2.html
x another/foundfile3.html
:

这显然效率低很多。对于 Perl 变体,我专门对脚本进行了调整,以便它分别跟踪每个输入文件的行号,这样您就可以使用这种更高效的语法(前提是您的find版本支持它);而对于sed地址 2,它仅匹配整个文件序列中的第二行,因此我们无论如何都被迫对每个文件执行此脚本的一个实例。

相关内容