我想检查多行文本是否与输入匹配。grep
接近了,但我找不到将模式解释为纯文本而不是正则表达式的方法。
我怎样才能做到这一点,只使用 Unix 实用程序?
使用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.
我已经测试过了,多行模式有效。
-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.)
如果您尝试匹配的输入字符串不包含空行(例如,它没有两个连续的换行符),您可以执行以下操作:
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