Linux bash 脚本删除某些文本



我有一个这样的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脚本可以工作,但是它会删除<!--/fff309-->下面的所有HTML部分

所以它变成了:

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

无论如何要这样做,以便它只删除零件:

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

谢谢

也许你可以使用 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

对于您的情况,最好使用 SED -i选项,该选项按如下方式进行替换。

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

问题不在于您的 sed,而在于您的 bash 脚本。删除"*.html"中的双引号。

Bash 将双引号字符串视为唯一字符串,即它不会使用 IFS 的值分隔字符串,也不会扩展通配符,从而避免脚本上的 f 变量只是一个<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

相关内容

  • 没有找到相关文章

最新更新