【发布时间】:2012-07-27 14:27:41
【问题描述】:
我的问题与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
但链接问题中建议的答案使用正则表达式作为不允许检查两个外围边界之间的线的范围。
有没有办法将一个范围内的所有行添加到模式缓冲区,以便我可以一次对所有行进行正则表达式?例如:
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 开始注释并在 第三个结束的区域 结束评论。
-
有什么建设性的说法吗?或许能告诉我为什么那可能不像我想的那样?
-
我确实有一个解决方案成功了一半,但解决我自己的问题却遇到了麻烦。 ;) 原因是正则表达式和区域都是 greedy:它们总是匹配可能的 longest 模式,即使这意味着跳过“end”模式到达那里。