【问题标题】:How to give a pattern for new line in grep?如何在 grep 中为新行提供模式?
【发布时间】:2012-09-21 01:55:05
【问题描述】:

如何在 grep 中为新行指定模式? 开头换行,结尾换行。不是正则表达式的方式。类似\n。

【问题讨论】:

  • 不清楚你想要什么。 new line at the beginning 是一个空行,new line at end 适用于文件中的每一行。可以举个例子吗?
  • 其实你可以用$。它有些有限,但在简单的情况下可用。

标签: bash grep newline


【解决方案1】:

grep 模式与单个行匹配,因此模式无法匹配输入中找到的换行符。

但是你可以找到像这样的空行:

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 

【讨论】:

  • 至少 GNU grep 有 -z 选项,可以让 grep 用空字符换行。但是,它似乎不支持换行符或模式中的 \n 以匹配换行符,请参阅bug report
  • @jarno 它支持带有 -P 标志的模式中的 \n
【解决方案2】:

你可以这样用……

grep -P '^\s$' file
  • -P 用于 Perl 正则表达式(POSIX grep 的扩展)。
  • \s 匹配空白字符;如果后跟*,它也匹配一个空行。
  • ^ 匹配行首。 $ 匹配行尾。

【讨论】:

  • -P 是一个 GNU 扩展。当情况需要时我可以使用它(通常是前瞻/后视),但 POSIX grep 只需使用 [[:space:]] 归档即可。
  • FWIW、Solaris' 和 BSD 的 grep 手册页(没有检查其他人)都有一段 -P。无论如何,GNU 是相当标准的。 :)
  • 来自手册页:[-P] FreeBSD 不支持此选项。
  • 对于 MacOsX 也没有 [-P]:grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C[num]] [-e 模式] [-f 文件] [ --binary-files=value] [--color[=when]] [--colour[=when]] [--context[=num]] [--label] [--line-buffered] [--空] [模式] [文件 ...]
  • @Niccolò 你会想要brew install grep 来获得 GNU grep,它在几个方面都非常出色。 apple.stackexchange.com/questions/193288/…
【解决方案3】:

尝试使用pcregrep 而不是常规的grep

pcregrep -M "pattern1.*\n.*pattern2" filename

-M 选项允许它匹配多行,因此您可以将换行符搜索为\n

【讨论】:

    【解决方案4】:

    至于解决方法(不使用不可移植的-P),您可以将换行符临时替换为不同的换行符并将其改回,例如:

    grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
    

    基本上它在寻找精确匹配_foo_,其中_ 表示\n(所以__ = \n\n)。您不必将其翻译回 tr '_' '\n',因为无论如何每个模式都会打印在新行中,因此删除 _ 就足够了。

    【讨论】:

    • 请原谅我的无知,但是使用进程替代不是另一个非 posix 兼容,因此是不可移植的功能?在 posix shell 中我做不到 &lt;(p paste -sd_ file )?
    【解决方案5】:

    感谢@jarno,我知道了 -z 选项,并且发现当使用带有 -P 选项的 GNU grep 时,可以匹配 \n。 :)

    示例:

    grep -zoP 'foo\n\K.*'&lt;&lt;&lt;$'foo\nbar'

    打印bar

    【讨论】:

    • 太好了,请注意,我没有收到关于答案中“@jarno”的通知。
    • 这太棒了!非常感谢您的分享!
    • 为我工作。非常感谢。 grep -zoPnir "dex\n035" ./dir/
    【解决方案6】:

    刚刚找到

    grep $'\r'
    

    它在 Bash 中使用 $'\r' 进行 c 风格的转义。

    this article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2016-01-29
      相关资源
      最近更新 更多