私バッシュシェルスクリプト一部の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}'