linux bash脚本删除某些文本

时间:2012-12-04 06:12:29

标签: linux bash scripting

我有一个像这样的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-->

由于

2 个答案:

答案 0 :(得分:1)

问题不在你的sed上,而在你的bash脚本中。 从“* .html”中删除双引号。

Bash认为双引号字符串是唯一的字符串,i。例如,它不会使用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

答案 1 :(得分:1)

可能您可以使用perl inplace替换,如下所示: 我已经改变了你的脚本,使其更简单。

#!/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