私は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 -->
awk
1 つのファイルで実行すると機能すると思われる次のコマンドを見つけました。
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}'