regex 在bash 'heredoc'中捕获标记词

mefy6pfw  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(117)

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”呢?

ljo96ir5

ljo96ir51#

在您的模式中,使用的是一个求反字符类[^<],它匹配除<之外的单个字符,在本例中是字符串<<EOF中的E字符
对于您的示例和使用pcre,您可以匹配前导空格,然后匹配<<,而不匹配后面的<

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

模式匹配:

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

参见regex demo

相关问题