在 bash 'heredoc' 中捕获标记词

Catch token word in bash 'heredoc'

提问人:mortenbo 提问时间:10/17/2023 更新时间:10/17/2023 访问量:61

问:

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

正如您在 << 和 EOF 之间没有空格的字符串中看到的那样,我只捕获“OF”而不是“EOF”。表达式必须正好匹配两个小于号,如果有三个或更多符号,则失败。但是,为什么它会吞噬“E”,以便只返回“OF”呢?

正则表达式 PCRE Heredoc

评论

0赞 The fourth bird 10/17/2023
这部分表示任何字符,但它确实消耗了一个字符,即 您可以匹配可选空格或 pcre[^<]<E<<EOF\h*
0赞 mortenbo 10/17/2023
那么,我如何精确匹配两个连续的字符,而不是一个或三个“<”字符呢?
0赞 The fourth bird 10/17/2023
对于示例字符串,如下所示 regex101.com/r/Z8ZU2z/1^\h*cat\h+<<\h*(.*)
0赞 mortenbo 10/17/2023
如果我在字符串中放入三个<<<,您的表达式不会失败。它必须失败。
1赞 The fourth bird 10/17/2023
我明白了,然后像这样^\h*cat\h+<<(?!<)(.*)

答:

2赞 The fourth bird 10/17/2023 #1

在您的模式中使用 are 使用否定字符类,该类与单个字符匹配,在本例中是字符串中的字符[^<]<E<<EOF

对于您的示例并使用 pcre,您可以匹配前导空格,然后在没有跟随的情况下进行匹配<<<

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

该模式匹配:

  • ^字符串的开头
  • \h*匹配可选的水平空格字符
  • cat\h+匹配和 1+ 水平空格字符cat
  • <<(?!<)匹配和断言,而不是直接向右<<<
  • (.*)捕获组 1 中的可选字符

观看正则表达式演示

评论

0赞 Cary Swoveland 10/18/2023
看来 Bash 的 HEREDOC 终止符必须至少有一个字符长,并且不能以空格开头,并且终止符之间可以出现零个或多个空格(或可能的空格)(例如,)。如果是这样,我想你会想要.>>...>> EOF^\h*cat\h+<<\s*([^<\s].*)
0赞 Cary Swoveland 10/18/2023
....或者只是匹配(即,没有捕获组)。^\h*cat\h+<<\s*\K[^<\s].*
1赞 The fourth bird 10/18/2023
@CarySwoveland啊,是的,如果它的长度至少为 1 个字符,您可以匹配一个非空格字符,而不是另一个选项 regex101.com/r/yWgnRY/1 或者防止一些回溯 regex101.com/r/7yMjcd/1<^\h*cat\h+<<\h*+(?!<)(.+)^\h*cat\h+<<\h*+([^\s<].*)
1赞 Cary Swoveland 10/19/2023
呃,“(例如,)”。感谢您的提醒。...<< EOF*+