从Bash脚本中,我正在尝试从以下文件中删除模式:
<%
delete this tag
%><? keep this tag ?>
<% keep this tag %>
但只有当该标签位于文件的开头时,才会触及以下内容:
text to keep
<%
don't delete me now
%>
我试图从其他问题的答案中拼凑出一些东西,但是却无法找到一个可以像这样工作的命令。
sed
这可能吗?是否有更好的工具可以使用?
答案 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"