为什么 awk 命令与 find 的配合效果不如 sed 的效果?

为什么 awk 命令与 find 的配合效果不如 sed 的效果?

我正在创建一个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}'

相关内容