我有一个像这样的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>
<body>
<div>some normal html code</div>
无论如何都要这样做,它只删除部分:
<!--fff309--> ... <!--/fff309-->
由于
答案 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