提问人:mortenbo 提问时间:10/17/2023 更新时间:10/17/2023 访问量:61
在 bash 'heredoc' 中捕获标记词
Catch token word in bash 'heredoc'
问:
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”呢?
答:
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
*+
评论
[^<]
<
E
<<EOF
\h*
^\h*cat\h+<<\h*(.*)
^\h*cat\h+<<(?!<)(.*)