【问题标题】:can't get perl multi-line substitution right无法正确获取 perl 多行替换
【发布时间】:2018-09-19 07:32:56
【问题描述】:

我无法理解 perl 中的多行匹配是如何工作的 我有一个文件,我想删除以下内容:

@keyword{

@keyword
{

在这两种情况下,@ 都是该行的第一个字符。

我可以使用两条单​​独的指令(使用“perl -p0777”):

s/\n\@keyword\{//
s/\n\@keyword\n\{//

但我认为以下内容也可以使用

s/\n\@keyword\n?\{//

但事实并非如此。它没有抓住第二种情况,我不明白为什么???

有什么解释吗?

【问题讨论】:

  • 与您的说法相反,s/\n\@keyword\n?\{// 有效,如果 s/\n\@keyword\n\{// 有效。
  • 当两个模式中的任何一个多次出现,并且 perl 被赋予 -0777 参数时,它只适用于每个模式的第一个实例。原因很明显(一旦理解了问题),我在“答案”中给出了它。但是不,如果没有 perl 指令末尾的“g”,它就无法工作。
  • 当两种模式中的任何一种多次出现时,两个版本都只做第一个,所以我的评论成立。

标签: regex perl multiline


【解决方案1】:

啊啊啊! 刚刚得到它。 因为perl -p0777,整个文件只有一行, 表达式在整个文件上匹配一次,因此每个语句只匹配一个模式。 解决方案是将“g”放在末尾:

s/\n\@keyword\n?\{//g

但现在是另一个。

我一开始没有 -0777 选项 我认为

s/^\@keyword\n?\{//m

会起作用的。 但它再次没有捕捉到第二种情况(两行模式)。 你能解释一下为什么吗?

【讨论】:

  • SO 不是论坛。将来,如果您有新问题,请将其作为问题提出。 /// m 只影响 ^$ 匹配的内容。它不可能导致模式^\@keyword\n?\{ 匹配字符串@keyword␊
  • 我不太明白这个评论。我有一个真正的问题(正如第一条消息末尾的问号所证明的那样)。恰好在提出问题之后,仍然试图解决问题(我花了整整一个上午的时间),我找到了答案。但即便如此,这个解决方案也不能令人满意,因为 -0777 阻止我进行任何基于行的转换(我还有其他转换要应用)。所以我想知道我该怎么做。而且,我再次提出了一个真正的问题,为什么我的暂定解决方案不起作用。
  • 至于///m,我知道将\n 放在正则表达式中会改变^$ 的解释方式,并且///m 会恢复通常的行为。可能是我错了吗?问题仍然是如何在不调用 perl -0777 ... 的情况下进行我需要的转换?
  • Re "问题仍然是如何在不调用 perl -0777 ... 的情况下进行我需要的转换?" 这是你第一次问这个问题,并且无法在评论中回答。如果您想提出新问题,请发布问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多