2

我有一个 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 `|'

任何想法是什么问题?更好的是,如果有人可以建议如何删除代码(包括标签),那将是理想的。

抱歉,如果问题很明显,我完全是新手。

4

3 回答 3

4

假使,假设:

  • 和评论总是成对BEGINEND
  • 您确定格式是固定的:<!-- (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

如果要保存回文件,可以使用-ised 选项。你也不需要cat将文件内容传递给sed

于 2013-04-01T21:02:14.023 回答
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文件扩展名的原始副本。

于 2013-04-01T20:59:58.883 回答
1

删除一行行(包括开始和结束标记)的最简单方法是:

sed -e '/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html

但是如果两个标记可以在同一行,那么您需要添加更多内容:

sed -e '/<!-- BEGIN -->.*<!-- END -->/{d;b;};/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
于 2013-04-01T21:06:55.543 回答