我有一个HTML文件,其中包含一些我想在编译应用程序时删除的内容。
需要删除的内容以"<!-- BEGIN -->"
为前缀,后缀为"<!-- END -->"
。所以这两个标签之间的所有东西(包括标签)都需要去。
<!-- BEGIN -->
Remove me
<!-- END -->
我相信以下命令只会注释掉所有代码:
# remove content between comments
cat src/html/project.html \
| sed -e 's/<!-- BEGIN -->/<!-- BEGIN /' \
| sed -e 's/<!-- END -->/ END -->/' \
> dist/html/project.html
导致:
<!-- BEGIN
Remove me
END -->
注释掉代码并不是我想要的,但我想它会做到。但是,即使在这种情况下,它也会生成语法错误:
./shell: line 3: syntax error near unexpected token `|'
任何想法是什么问题?更好的是,如果有人可以建议如何删除代码(包括标签),那将是理想的。
对不起,如果问题很明显,我就是这个东西的新手。
答案 0 :(得分:3)
假设:
BEGIN
和END
评论始终配对<!-- (onespace) BEGIN/END (onespace) -->
BEGIN, END
评论位于其自己的行中:这将完成工作:
sed '/<!-- BEGIN -->/,/<!-- END -->/d' file
如果我们举个例子:
kent$ cat file
<!-- BEGIN -->
Remove me
<!-- END -->
we
<!-- BEGIN -->
22Remove me
<!-- END -->
need
<!-- BEGIN -->
33Remove me
33Remove me
<!-- END -->
this
<!-- BEGIN -->
44Remove me
<!-- END -->
kent$ sed '/<!-- BEGIN -->/,/<!-- END -->/d' file
we
need
this
如果要保存回文件,可以使用sed的-i
选项。
您也不需要cat
将文件内容传递给sed
答案 1 :(得分:2)
删除所有不必要的管道命令:
sed -i.bak -e 's/\(<!-- BEGIN \)-->/\1/' -e 's/<!--\( END -->\)/ \1/' src/html/project.html
正如您的问题所说,您可能想要删除2个标签之间的内容,请使用:
sed -i.bak '/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
-i.bak
会对指定文件进行内联更改,并保存原始文件的副本.bak
。
答案 2 :(得分:1)
删除行块(包括开始和结束标记)的最简单方法是:
sed -e '/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
但是如果两个标记都在同一条线上,那么你需要再加一点:
sed -e '/<!-- BEGIN -->.*<!-- END -->/{d;b;};/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html