12

我想检查多行文本是否与输入匹配。grep接近了,但我找不到将模式解释为纯文本而不是正则表达式的方法。

我怎样才能做到这一点,只使用 Unix 实用程序?

4

3 回答 3

10

使用grep -F

-F, --fixed-strings

将 PATTERN 解释为固定字符串的列表,由换行符分隔,其中任何一个都将被匹配。(-F由 POSIX 指定。)

编辑:最初我对这个问题的理解不够好。如果模式本身包含换行符,请使用-z选项:

   -z, --null-data
          Treat  the  input  as  a set of lines, each terminated by a zero
          byte (the ASCII NUL character) instead of a newline.   Like  the
          -Z  or --null option, this option can be used with commands like
          sort -z to process arbitrary file names.

我已经测试过了,多行模式有效。

于 2013-01-31T17:41:08.047 回答
1

man grep

-F, --fixed-strings
       Interpret  PATTERN  as  a  list  of  fixed strings, separated by
       newlines, any of which is to be matched.  (-F  is  specified  by
       POSIX.)
于 2013-01-31T17:40:37.093 回答
1

如果您尝试匹配的输入字符串不包含空行(例如,它没有两个连续的换行符),您可以执行以下操作:

awk 'index( $0, "needle\nwith no consecutive newlines" ) { m=1 }
    END{ exit !m }' RS= input-file && echo matched

如果您需要查找具有连续换行符的字符串,请将 RS 设置为文件中不存在的某个字符串。(请注意,如果您将 RS 设置为多个字符,则 awk 的结果是未指定的,但大多数awk会允许它是一个字符串。)如果您愿意将搜索的字符串设置为正则表达式,并且您的 awk 支持将 RS 设置为不止一个字符,你可以这样做:

awk 'END{ exit NR == 1 }' RS='sought regex' input-file && echo matched
于 2013-01-31T18:23:30.640 回答