bash 中“heredoc”字符串的开头通常看起来像这样
cat <<EOF or cat << EOF
即两个小于号字符和标记词“EOF”之间可能有空格,也可能没有空格。我想捕捉标记词,所以我尝试以下
$ pcretest
PCRE version 8.45 2021-06-15
re> "^\s*cat.*[^<]<{2}[^<](.*)"
data> cat << EOF
0: cat << EOF
1: EOF
data> cat <<EOF
0: cat <<EOF
1: OF
正如您在字符串中看到的,<< and EOF, I only catch "OF" and not "EOF". The expression must match exactly two less-than signs and fail if there are three or more. But why does it gobble up the 'E' so that only "OF" is returned?
之间没有空格在您的模式中,使用的是否定字符类
[^<]
,它与 <
以外的单个字符匹配,在本例中是字符串 E
中的
<<EOF
字符
对于您的示例和使用 pcre,您可以匹配前导空格,然后匹配
<<
而无需后续 <
^\h*cat\h+<<(?!<)(.*)
模式匹配:
^
字符串开头\h*
匹配可选的水平空白字符cat\h+
匹配 cat
和 1+ 个水平空白字符<<(?!<)
匹配 <<
并直接断言不是 <
到右侧(.*)
捕获第 1 组中的可选字符查看 正则表达式演示