【问题标题】:Use Grep to find blocks of text between two phrases (including the phrases)使用 Grep 查找两个短语(包括短语)之间的文本块
【发布时间】:2012-11-30 03:25:28
【问题描述】:

是否可以使用 grep 来高精简所有以以下开头的文本:

mutablePath = CGPathCreateMutable();

并以:

结尾
CGPathAddPath(skinMutablePath, NULL, mutablePath);

这两个短语之间的文字数量是多少?

注意:我必须使用 grep,因为我使用的是 BBEdit。

【问题讨论】:

  • 你想grep这些行之间的文本?
  • @qtax - 不,我写错了,我需要短语之间的文本,以及两个封闭的短语。
  • @StackOverFlowRider:更新了我的答案。 HTH。

标签: regex linux unix grep bbedit


【解决方案1】:

您需要使用GNU grep:

grep -oPz 'mutablePath = CGPathCreateMutable\(\);.*?(\n.*?)*.*?CGPathAddPath\(skinMutablePath, NULL, mutablePath\);' file

如果您没有GNU grep,您可以使用pcregrep 来实现相同的目的:

pcregrep -M 'mutablePath = CGPathCreateMutable\(\);.*(\n|.)*CGPathAddPath\(skinMutablePath, NULL, mutablePath\);' file

【讨论】:

    【解决方案2】:

    如果您想打印这些之间的行并包括这些行,您可以使用:

    perl -ne '/start line/ .. /end line/ and print'
    

    【讨论】:

      【解决方案3】:

      您可以像这样使用 sed:

      sed -n '/mutablePath = CGPathCreateMutable();/,/CGPathAddPath(skinMutablePath, NULL, mutablePath);/p' infile
      

      编辑:

      不确定 BBEdit 是否支持 grep 的 -P 标志。如果是,那么你可以使用这个:

      grep -oP 'mutablePath = CGPathCreateMutable();\X*CGPathAddPath(skinMutablePath, NULL, mutablePath);/' infile
      

      根据 grep 手册页:

      -P, --perl-正则表达式 将 PATTERN 解释为 Perl 正则表达式。

      【讨论】:

      • 我必须使用 grep 因为我使用的是 BBedit(抱歉忘了提)
      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      相关资源
      最近更新 更多