我正在創建一個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}'