bash中的'heredoc'字符串的开头通常看起来像
cat <<EOF or cat << 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
正如你在字符串中看到的,在<<和之间没有空格,我只捕获“OF”而不是““。表达式必须恰好匹配两个小于号,如果有三个或更多则失败。但是为什么它会吞噬掉“E”,只返回“OF”呢?
1条答案
按热度按时间ljo96ir51#
在您的模式中,使用的是一个求反字符类
[^<]
,它匹配除<
之外的单个字符,在本例中是字符串<<EOF
中的E
字符对于您的示例和使用pcre,您可以匹配前导空格,然后匹配
<<
,而不匹配后面的<
模式匹配:
^
字符串开头\h*
匹配可选的水平空白字符cat\h+
匹配cat
和1+个水平空白字符<<(?!<)
匹配<<
并直接在右侧Assertnot<
(.*)
捕获组1中的可选字符参见regex demo