2017-07-26 58 views
0

的第一線從bash腳本,我試圖從像文件刪除模式如下:刪除多行的模式開始在文件中只

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

但是,只有當該標籤是在開頭的文件,所以下面將觸及:

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

我試圖從其他問題的答案拼湊的東西,但一直沒能拿出一個命令,將這樣工作。

這可能與sed?有沒有更好的工具可以使用?

+0

你能告訴我們你的文件的一個實際的例子,以獲得更多的啓示:

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

命令的解釋? – Inian

+0

請添加您嘗試的任何命令......它會顯示您的努力...是perl好嗎? – Sundeep

回答

0

所以發佈後,我想出瞭如何在sed使用下面的命令:

sed -e 
    '/<%/   # When we match the start pattern, '<%', execute the following command block 
    { 
     1!b;  # If we're not on the first line when we match the start pattern, exit 
     :x;   # Define label 'x' 
     $!N;  # If not at the end of file, capture the current line 
     /%>/!bx; # If we're not at the end pattern, '%>', go to label 'x' 
     s/<%.*%>// # After reaching the end pattern, replace all matching text in the captured lines with nothing 
    }' 
    -i "file" 
0

你應該使用sed,如:

sed '0,/REGEXP/' your_input_file 

其中REGEXP是你想要的正則表達式。

3

如果你想給perl機會那麼這應該工作:

​​

破碎:

  • -0777:啜食模式,以適應所有包括換行符
  • ^\s*文件文本:匹配開始,後跟0或更多空格
  • <%.*?%>:彰顯標籤(懶惰)

要重新更改保存到文件:

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

謝謝!這確實有效,但我設法使用'sed'找到解決方案。我只是爲了與同一腳本中的其他命令保持一致而採取了這種做法。 – PseudoPsyche

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 
%>