为什么这个 awk 命令不能像 sed 那样与 find 一起使用?

Que*_*ner 4 sed find awk

我正在创建一个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' {} \;
Run Code Online (Sandbox Code Playgroud)

它查看相关目录中的每个 HTML 文件,并替换一行文本。

我想做一些类似的事情,在两个 HTML 注释之间替换多行。

所以我想采取这个:

<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->
Run Code Online (Sandbox Code Playgroud)

我发现这个awk命令在我在一个文件上运行时似乎有效:

awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p' justonefile.html
Run Code Online (Sandbox Code Playgroud)

所以我想我可以执行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'
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,它说:

find: `-exec' no such parameter
Run Code Online (Sandbox Code Playgroud)

有没有办法让我的 awk 命令在所有 HTML 文件上运行?

额外问题:我还可以删除要替换的文本周围的两个标签吗?所以<!-- STARTREPLACE1 --><!-- ENDREPLACE1 -->被删除,我最终只得到:

A whole new world!
Run Code Online (Sandbox Code Playgroud)

enz*_*tib 8

首先,你需要结束-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"
Run Code Online (Sandbox Code Playgroud)

给它可执行权限

chmod +x ./replace
Run Code Online (Sandbox Code Playgroud)

然后运行

find "$DIR" -type f -iname '*.html' -exec ./replace {} \;
Run Code Online (Sandbox Code Playgroud)