為什麼 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}'

相關內容