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

Shell sed命令替换文件中的代码并保存,shell,unix,sed,Shell,Unix,Sed,我有一个HTML文件,其中包含一些我想在编译应用程序时删除的内容 需要删除的内容前缀为”,后缀为”。因此,这两个标记(包括标记)之间的所有内容都需要删除 <!-- BEGIN --> Remove me <!-- END --> 你知道问题出在哪里吗?更好的是,如果有人能建议如何删除代码(包括标记),那将是理想的 很抱歉,如果问题很明显,我是这方面的新手。删除所有不必要的管道命令: sed -i.bak -e 's/\(<!-- BEGIN \)-->/\1

我有一个HTML文件,其中包含一些我想在编译应用程序时删除的内容

需要删除的内容前缀为
,后缀为
。因此,这两个标记(包括标记)之间的所有内容都需要删除

<!-- BEGIN -->
Remove me
<!-- END -->
你知道问题出在哪里吗?更好的是,如果有人能建议如何删除代码(包括标记),那将是理想的


很抱歉,如果问题很明显,我是这方面的新手。

删除所有不必要的管道命令:

sed -i.bak -e 's/\(<!-- BEGIN \)-->/\1/' -e 's/<!--\( END -->\)/    \1/' src/html/project.html
sed-i.bak-e's/\(/\1/'-e's/\)/\1/'src/html/project.html
正如您的问题所述,您可能希望删除两个标记之间的内容,然后使用:

sed -i.bak '/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
sed-i.bak'//,//d'src/html/project.html
-i.bak
将对给定文件进行内联更改,并以
.bak
文件扩展名保存原始文件的副本。

假设:

  • 开始
    结束
    注释总是成对的
  • 您确定格式是固定的:
  • BEGIN,END
    注释位于自己的行中:
这将完成以下工作:

 sed '/<!-- BEGIN -->/,/<!-- END -->/d' file
sed'//,//d'文件
如果我们举一个例子:

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
kent$cat文件
把我带走
我们
22把我带走
需要
把我带走
把我带走
这
把我带走
kent$sed'//,//d'文件
我们
需要
这
如果要保存回文件,可以使用sed的
-i
选项。
此外,您不需要使用
cat
将文件内容传递给
sed

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

sed -e '/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
sed-e'//,//d'src/html/project.html
但如果两个标记可以在同一行上,则需要再添加一点:

sed -e '/<!-- BEGIN -->.*<!-- END -->/{d;b;};/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
sed-e'/./{d;b;};////d'src/html/project.html

您必须使用
sed
perl
python
甚至仅仅是
awk
都能更好地处理类似的问题。您说过您不想注释掉这些行,您想从文件中删除它们吗?比如说,
?@miorel-awk也可以。。。或任何其他命令。我只是不知道语法是怎么回事。如果你有任何建议,那就太好了。@肯特-是的,没错。语法错误是因为管道符号应该在每一行的末尾,而不是下一行的开头。一旦换行符写对了,您也不需要跳过换行符。最后,sed不需要cat和管道,因为sed可以像cat一样轻松地打开文件。这就是众所周知的UOOC(谷歌it)。非常感谢。我刚试过这个,但发现一个语法错误。你能告诉我这有什么问题吗:cat-app/index.php | sed-e's/(/\1/'-e's/)/\1/'>build/app/index.phpPls不使用cat和pipe。如上所述,您可以直接在文件上调用sed。另外,请确保在(和)前面加上反斜杠,如上图所示。但如果我想将其放入shell脚本并作为作业的一部分运行,该怎么办?…我还应该注意,我不想替换文件,而是创建一个副本。-i.bak选项将创建一个备份,但我更愿意创建一个全新的文件并保留源代码。好的,在这种情况下,不要使用
-i.bak
选项并将sed的输出重定向到任何其他文件。谢谢@Kent,最后我将对此进行演示,这是我的解决方案。谢谢肯特:)谢谢大家的回答!在Kent的第二个假设中,您可以使用稍微复杂一点的RE
sed-E'//,//d'文件
,或者将
+
替换为
*
,使空格成为可选的。
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 -e '/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html
sed -e '/<!-- BEGIN -->.*<!-- END -->/{d;b;};/<!-- BEGIN -->/,/<!-- END -->/d' src/html/project.html