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

例如,

  • 在您的目录中创建两个或多个.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

对于您的情况,最好使用-ised 选项,它可以进行如下替换。

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 回答