在 bash 'heredoc' 中捕获标记词

问题描述 投票:0回答:1

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?

之间没有空格
regex pcre heredoc
1个回答
0
投票

在您的模式中,使用的是否定字符类

[^<]
,它与
<
以外的单个字符匹配,在本例中是字符串
E
 中的 
<<EOF

字符

对于您的示例和使用 pcre,您可以匹配前导空格,然后匹配

<<
而无需后续
<

^\h*cat\h+<<(?!<)(.*)

模式匹配:

  • ^
    字符串开头
  • \h*
    匹配可选的水平空白字符
  • cat\h+
    匹配
    cat
    和 1+ 个水平空白字符
  • <<(?!<)
    匹配
    <<
    并直接断言不是
    <
    到右侧
  • (.*)
    捕获第 1 组中的可选字符

查看 正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.