点号 . 通常不匹配换行符 \n
关键事实
. 不匹配换行符:
在大多数正则引擎中(包括 sed, grep, perl 等),元字符 . 默认不匹配换行符 \n
因此 .* 只能匹配当前行内的任意字符序列
^ 和 $ 的默认行为:
^ 匹配行首(不是文件开头)
$ 匹配行尾(不是文件结尾)
在多行文本中,它们只作用于当前行
.* 天生是单行的:默认只能匹配当前行内的内容
测试文件 test.txt
text
first line
second line
third line
grep 'first.*second' test.txt
第二行:second line → 单独处理
两行之间被换行符 \n 隔开,而 . 不匹配 \n
可以通过以下方式实现跨行匹配:
N
命令合并行后匹配\n
sed -n '/^it/{N; /\nnginx/p}' file
-z
选项(将文件视为单行)grep -Pzo 'it.*nginx' file