awkコマンドとfindがsedほど機能しないのはなぜですか?

awkコマンドとfindがsedほど機能しないのはなぜですか?

バッシュシェルスクリプト一部の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ファイルを確認し、テキスト行を置き換えます。

同様のことをしたいと思います。 2つの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

すべてのHTMLファイルでawkコマンドを実行する方法はありますか?

ボーナス質問:置き換えたいテキストを囲む2つのタグも削除できますか?したがって、<!-- 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}'

関連情報