1

私はこのようなbashスクリプトを持っています:

#!/bin/bash
# ALL HTML FILES
FILES="*.html"
# for loop read each file
for f in $FILES
do
INF="$f"
OUTF="$f.out.tmp"
# replace javascript
sed '/<!--fff309/,/<!--\/fff309-->/d' $INF > $OUTF
/bin/cp $OUTF $INF
/bin/rm -f $OUTF
done

HTMLは次のようになります。

<html>
<body>
<div>some normal html code</div><!--fff309-->some javascript code goes here... <!--/fff309-->

<div>
some other html....
</div>
</body>
</html>

bashスクリプトは機能しますが、以下のすべてのhtml部分が削除されます。<!--/fff309-->

したがって、次のようになります。

<html>
<body>
<div>some normal html code</div>

とにかく、パーツのみを削除するようにする方法はありますか?

<!--fff309--> ...  <!--/fff309-->

ありがとう

4

2 に答える 2

1

問題は sed ではなく、bash スクリプトにあります。「*.html」から二重引用符を削除します。

Bash は、二重引用符で囲まれた文字列を一意の文字列と見なします。つまり、IFS の値を使用して文字列を分離したり、ワイルドカードを展開したりせず、fスクリプトの変数が単純に a になることを回避<name>.htmlし、強制的に*.html.

さまざまな結果をエコーすると、二重引用符を使用すると変数fが になり*.html、エコーすると展開が実行されるため、次のようになります<name_1>.html <name_2>.html ... <name_n>.html

例えば、

  • ディレクトリに2 つ以上の.htmlファイルを作成します。
  • 次のスクリプトを実行します。

    #!/bin/bash
    
    echo "Incorrect:"    
    for i in "*.html"; do
        echo $i;
    done
    
    echo "Correct:"
    for i in *.html; do
        echo $i;
    done
    

次のことを試してください。

#!/bin/bash
# ALL HTML FILES
FILES=*.html
# for loop read each file
for f in $FILES
do
INF=$f
OUTF=$f.out.tmp
# replace javascript
sed '/<!--fff309/,/<!--\/fff309-->/d' $INF > $OUTF
/bin/cp $OUTF $INF
/bin/rm -f $OUTF
done
于 2012-12-04T06:47:41.410 に答える
1

以下のように、これに perl インプレース置換を使用できる場合があります。よりシンプルにするために、スクリプトを以下のように変更しました。

#!/bin/bash
# ALL HTML FILES
FILES="*.html"
# for loop read each file
for f in $FILES
do
perl -i -lne 'print unless(/\<\!--fff309--\>/.../\<\!--\/fff309--\>/)' $f
done

主なタスクは次の行で実行されます。

perl -i -lne 'print unless(/\<\!--fff309--\>/.../\<\!--\/fff309--\>/)'

これにより、一時ファイルを作成する必要なく、ファイルが直接変更されます。私はそれをテストし、コマンドは私のために働きます。

また、sedの使用を主張する場合は、以下が機能します。

sed '/\<\!--fff309--\>/,/\<\!--\/fff309--\>/d' your_file

あなたの場合-i、以下のように代わりに置換を行う sed のオプションを使用することをお勧めします。

sed -i '/\<\!--fff309--\>/,/\<\!--\/fff309--\>/d' your_file

これを使用すると、スクリプトは次のように変更されます。

#!/bin/bash
# ALL HTML FILES
FILES="*.html"
# for loop read each file
for f in $FILES
do
sed '/\<\!--fff309--\>/,/\<\!--\/fff309--\>/d' $f
done

HTMLファイルを見た後:

これはあなたが必要とするものです:

perl -pi -e 's/\<\!--fff309--\>.*\<\!--\/fff309--\>//g' your_file

したがって、スクリプトは次のようになります。

#!/bin/bash
# ALL HTML FILES
FILES="*.html"
# for loop read each file
for f in $FILES
do
perl -pi -e 's/\<\!--fff309--\>.*\<\!--\/fff309--\>//g' $f
done
于 2012-12-04T06:57:26.370 に答える