在这个grep中需要写`\n`吗?

在这个grep中需要写`\n`吗?

我试图搜索以 开头create和结尾的行;。匹配可能跨越多行。我试图使用grep为此,在搜索互联网后我发现了如何做到这一点。

下面的查询可以做到这一点

grep -zioE 'create (\w|\W|\n)*?;' Day1.sql  | less


# Output
create schema sigmoid_db;
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2));

我想问为什么同样的查询没有\n工作?像下面的查询应该产生相同的输出

grep -zioE 'create (\w|\W)*?;' Day1.sql  | less

# Output
create schema sigmoid_db;

我的推理是\w|\W应该匹配任何字符。但第二个命令不会打印跨多行的模式。

谁能告诉我为什么会这样吗?

答案1

\n符号是回车符。这是一个将一行与另一行分开的特殊符号。

任何文本文件实际上都是一长串,例如:

first\nsecond\nthird\n

在屏幕上打印为

first
second
third

grep输入文件分割成行并逐行处理它们。如果您想找到多行模式,则必须\n在正则表达式的适当位置使用。

这就是该模式create (\w|\W)*?;仅找到单行匹配的原因。

并且,控制符号(并且是其中之一)不被视为“字母”( )或“非字母”( )\n组的成员。它们属于自己的一个组,必须单独使用。\w\W

相关内容