我想在目录中的所有 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,它仅匹配整个文件序列中的第二行,因此我们无论如何都被迫对每个文件执行此脚本的一个实例。