我的問題與shell script: search and replace over multiple lines類似的問題有一個小例外。正則表達式查找和替換殼牌中的多行
在問題鏈接的用戶要做到這一點:
source:
[stuff before]
<!--WIERD_SPECIAL_COMMENT_BEGIN-->
[stuff here, possibly multiple lines.
<!--WIERD_SPECIAL_COMMENT_END-->
[stuff after]
target:
[stuff before]
[new content]
[stuff after]
我的問題是相似的,我想這樣做:
source:
[stuff before]
<!--WIERD_SPECIAL_COMMENT_BEGIN-->
[this]
<!--WIERD_SPECIAL_COMMENT_END-->
<!--WIERD_SPECIAL_COMMENT_BEGIN-->
[not this]
<!--WIERD_SPECIAL_COMMENT_END-->
[stuff after]
target:
[stuff before]
[new content]
<!--WIERD_SPECIAL_COMMENT_BEGIN-->
[not this]
<!--WIERD_SPECIAL_COMMENT_END-->
[stuff after]
在一個適當的多正則表達式,這是很容易做到:
/<!--WIERD_SPECIAL_COMMENT_BEGIN-->.*[this].*<!--WIERD_SPECIAL_COMMENT_END-->/m
但在鏈接問題中建議的答案使用正則表達式作爲不允許檢查的範圍兩個邊界之間的界限。
是否有任何方法可以將一個範圍內的所有行添加到模式緩衝區,以便我可以一次對所有行進行regex?例如:
sed '
#range between comment beginning and comment end
/<!--WIERD_SPECIAL_COMMENT_BEGIN-->/,/<!--WIERD_SPECIAL_COMMENT_END-->/
#Do something to add the lines in this range to pattern buffer
/.*[this].*/d
#Delete all the lines if [this] is in the pattern buffer
' <in.txt >out.txt
你的「易」正則表達式可能不會做你所期望的:它可能發現開始的區域* first *開始註釋並以* third * end註釋結束。 – ams 2012-07-27 15:35:21
有什麼建設性的說法?也許告訴我爲什麼這可能不會做我認爲的? – 2012-07-27 15:46:43
我的確有一個解決方案,但解決了我自己的問題。 ;)原因是正則表達式和區域都是*貪婪*:它們總是匹配儘可能長的*模式,即使這意味着要跳過'結束'模式才能到達那裏。 – ams 2012-07-30 07:57:10