从第一行文件开始删除多行模式

时间:2017-07-26 07:35:35

标签: regex bash sed

从Bash脚本中,我正在尝试从以下文件中删除模式:

<%
delete this tag
%><? keep this tag ?>
<% keep this tag %>

但只有当该标签位于文件的开头时,才会触及以下内容:

text to keep
<%
don't delete me now
%>

我试图从其他问题的答案中拼凑出一些东西,但是却无法找到一个可以像这样工作的命令。

sed这可能吗?是否有更好的工具可以使用?

4 个答案:

答案 0 :(得分:3)

如果你想给perl一个机会,那么这应该有效:

perl -0777 -pe 's/^\s*<%.*?%>//s' file

<? keep this tag ?>
<% keep this tag %>

<强>解体:

  • -0777:slurp模式以匹配所有文件文本,包括换行符
  • ^\s*:匹配开始后跟0或更多空格
  • <%.*?%>:匹配您的代码(懒惰)

将更改保存回文件:

perl -i -0777 -pe 's/^\s*<%.*?%>//s' file

答案 1 :(得分:1)

使用awk:

$ awk '
NR==1 && /</ { d=1 }     # if < on the first line raise the del flag
d==1 {                   # if del flag up
    if(/>/)              # lower del flag at >
        d=0              
    sub(/<?[^>]+>?/,"")  # replace from < to > with nuthin
} 
/./                      # print nonempty lines
' file
<? keep this tag ?>
<% keep this tag %>

处理了另一个文件:

text to keep
<%
don't delete me now
%>

答案 2 :(得分:0)

您应该使用sed,例如:

sed '0,/REGEXP/' your_input_file

其中REGEXP是您想要的正则表达式。

答案 3 :(得分:0)

所以在发布之后,我想出了如何使用以下命令在defer中执行此操作:

sed

命令的解释:

sed -e '/<%/{1!b;:x;$!N;/%>/!bx;s/<%.*%>//}' -i "file"