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