linux - 搜索 HTM 文件并在第一行添加

标签 linux shell unix sed grep

我找不到搜索哪些 HTM* 文件没有 DOCTYPE 并将此 DOCTYPE 添加到此特定文件的好方法

我得到了文件列表:

for i in ` find . -name "*.htm*" -print`; do grep -L "DOCTYPE" $i;done;

但是我找不到如何使用 sed 处理这个列表

我试过了:

for i in ` find . -name "*.htm*" -print; grep -L "DOCTYPE"`; do sed -i '1i <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' $i; done;

但它会在所有 HTM* 文件上添加该行

谢谢

最佳答案

您应该使用-exec 选项来find,而不是编写您自己的循环:

find . -name '*.htm?' -exec sed -i .bak '1 { /DOCTYPE/ ! i\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
}' {} +

这会找到所有以 .htm 结尾的文件,后跟可选的额外字符并执行 sed 命令。如果 /DOCTYPE/ 在第一行不匹配,则插入该字符串。

-exec{} + 结合使用意味着使用最少数量的 sed 实例,而不是为找到的每个文件运行一个单独的实例。

我在 -i 后添加了一个参数,以便创建后缀为 .bak 的备份文件。

关于linux - 搜索 HTM 文件并在第一行添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39634570/

相关文章:

bash - 在使用简单的 awk 脚本时遇到问题

linux - 重定向包含的输出字符串

无法使用 perl 中的系统命令获取已编译 C 程序执行的标准错误

unix - 如何使用 awk、sed 或其他 unix 命令每隔 n 个间隔获取一个行范围?

shell - awk 和带有多个变量的 for 循环

linux - Linux bash 中的多重重命名

linux - Docker 只监听 8080 端口

C程序扩展运行PHP

regex - 如何将 grep 正则表达式匹配结果保存到变量?

c - 标准 C mktime 线程在 Linux 上安全吗?