5

私はまだシェルスクリプトの初心者ですが、頑張っています。以下は、タグを一致させ、それらに含まれるコンテンツを削除することにより、*.htm ドキュメントからすべての JS を削除することになっている、部分的に機能するシェル スクリプトです。例<script src=""><script></script>および<script type="text/javascript">

find $1 -name "*.htm" > ./patterns
for p in $(cat ./patterns)
do
sed -e "s/<script.*[.>]//g" $p #> tmp.htm ; mv tmp.htm $p
done

このスクリプトの問題は、sed がテキスト入力を 1 行ずつ読み取るため、このスクリプトが改行で期待どおりに機能しないことです。ランニング:

<script>
//Foo
</script>

最初のスクリプトタグを削除しますが、不要な「foo」と終了タグを省略します。

正規表現で改行文字を一致させる方法はありますか? または、sed適切でない場合、他に使用できるものはありますか?

4

3 に答える 3

6

<script>たとえば、次のようなさまざまな行にタグがあると仮定します。

foo
bar
<script type="text/javascript">
some JS
</script>
foo

以下はうまくいくはずです:

sed '/<script/,/<\/script>/d' inputfile
于 2013-07-16T08:33:31.947 に答える
1

このスクリプトはタグawkを探し、変数を設定してから次の行を読み取ります。終了タグが見つかると、変数はゼロに設定されます。変数がゼロの場合、最終的な印刷パターンはすべての行を出力します。<script*>in</script*>in

awk '/<script.*>/   { in=1; next }
     /<\/script.*>/ { if (in) in=0; next }
    { if (!in) print; } ' $1
于 2013-07-16T08:29:56.060 に答える
0

ご指摘のとおり、問題はsed入力を 1 行ずつ処理することです。

したがって、最も簡単な回避策は、入力を 1 行にすることです。たとえば、入力に存在しないと確信している文字で改行を置き換えます。

使用したくなるでしょうtr :

… |tr '\n' '_'|sed 's~<script>.*</script>~~g'|tr '_' '\n'

ただし、「現在、tr完全にサポートされているのは 1 バイト文字のみですˇ」。安全のために、おそらく役に立たない のようなありそうもない文字を使用することをお勧めしますtr

幸いなことに、分岐を使用sedして、同じことが達成できます。

例に戻ると<script>…&lt;/script>、これは機能し、(前のリンクによると) クロスプラットフォームになります。

… |sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ˇ/g' -e 's~<script>.*</script>~~g' -e 's/ˇ/\n/g'

または、GNU を使用sedしていてクロスプラットフォームの互換性を必要としない場合は、より簡潔な形式で:

… |sed ':a;N;$!ba;s/\n/ˇ/g;s~<script>.*</script>~~g;s/ˇ/\n/g'

分岐部分の詳細については、「分岐を使用する」の下のリンクされた回答を参照してください ( :a;N;$!ba;)。残りの部分は簡単です:

  • s/\n/ˇ/gˇ すべての改行を;に置き換えます。
  • s~<script>.*</script>~~g削除する必要があるものを削除します(実際の使用にはある程度のセキュリティが必要であることに注意してください。最初<script>と最後の間のすべてを削除します。また、スラッシュのエスケープを回避する代わり</script> に使用したことに注意してください :使用できた)のようないくつかの予約文字を除く、ほぼすべてのシングルバイト文字。~/</script>\
  • s/ˇ/\n/g改行を読み取ります。
于 2017-03-24T11:37:16.567 に答える