この awk コマンドは、なぜ sed ほど find ではうまく動作しないのでしょうか?

この awk コマンドは、なぜ sed ほど find ではうまく動作しないのでしょうか?

私はBash シェル スクリプトいくつかの 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 ファイルを調べ、テキストの 1 行を置き換えます。

2 つの HTML コメント間の複数行を置き換えるという同様の操作を実行したいと考えました。

そこで私はこれを取り上げたいと思います:

<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->

次のように変更します。

<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->

awk1 つのファイルで実行すると機能すると思われる次のコマンドを見つけました。

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}'

関連情報