我试图搜索以 开头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