我正在创建一个Bash shell 脚本对某些 HTML 文件进行一些文件操作。
在我所做的许多操作中,我有一个sed
非常有效的命令:
find $DIR -type f -name '*.html' -exec sed -i 's/.*<script type="text\/javascript" charset="utf-8" src="file.js"><\/script>.*/<script type="text\/javascript" charset="utf-8" src="file2.js"><\/script>/g' {} \;
它会检查相关目录中的每个 HTML 文件,并替换一行文本。
我想做类似的事情,替换两个 HTML 注释之间的多行。
所以我想采取这个:
<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->
并将其更改为:
<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->
我发现这个awk
命令在一个文件上运行时似乎有效:
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p' justonefile.html
所以我想我可以执行find
与我使用的相同的功能sed
并在此处应用该方法,以便awk
在目录中的每个 HTML 文件上运行此命令:
find $DIR -type f -name '*.html' -exec awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p'
但当我运行它时,它说:
find: `-exec' no such parameter
有没有办法让我的 awk 命令在所有 HTML 文件上运行?
奖金问题:我还可以删除要替换的文本周围的两个标签吗?所以<!-- STARTREPLACE1 -->
和<!-- ENDREPLACE1 -->
被删除,我最终只得到:
A whole new world!
答案1
首先,您需要-exec
以 结束操作{} \;
。
其次,不要像(使用选项)awk
那样就地修改文件,因此您应该将输出发送到临时文件,然后将其移动到原始文件。sed
-i
replace
创建一个包含以下内容的脚本(假设我们称之为):
#!/bin/sh
tfile=$(mktemp)
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}
/<!-- ENDREPLACE1 -->/ {p=0}' "$1" >"$tfile" && \
mv "$tfile" "$1"
赋予其可执行权限
chmod +x ./replace
然后运行
find "$DIR" -type f -iname '*.html' -exec ./replace {} \;
答案2
还有奖金:
gawk '{!p} /<!-- STARTREPLACE1 -->/{print "A whole new world!";p=1}/<!-- ENDREPLACE1 -->/{p=0}'