sed命令替换文件中的代码并保存

时间:2013-04-01 20:50:16

标签: shell unix sed

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

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

对不起,如果问题很明显,我就是这个东西的新手。

3 个答案:

答案 0 :(得分:3)

假设:

  • 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

如果要保存回文件,可以使用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