我正在尝试使用bash正则表达式匹配来解析多行字符串中的一行。为什么以下选项不起作用?
if [[ $qout =~ ${q}[^\n]* ]] ; then它与字母n相匹配。我尝试过使用\\n甚至\\\n,但都不起作用。
$qout包含:
unrouted 0 0 running
dead-letter 0 0 running$q包含unrouted。
${BASH_REMATCH[0]的评估结果为:
unrouted 0 0 ru我做错了什么?
发布于 2020-09-27 04:58:15
[\n]不匹配换行符--它匹配文字反斜杠或n。如果您运行nl=$'\n',然后使用$nl作为您的正则表达式,事情将按预期工作。
#!/usr/bin/env bash
qout='unrouted 0 0 running
dead-letter 0 0 running'
q=unrouted
nl=$'\n'
if [[ $qout =~ ${q}[^$nl]*[$nl] ]]; then
declare -p BASH_REMATCH
else
echo "No match found" >&2
fi...emits作为输出:
declare -ar BASH_REMATCH=([0]=$'unrouted 0 0 running\n')发布于 2020-09-27 04:51:05
假设:
从多行变量(
qout)中提取包含模式模式的行(从模式(q)到行尾(要在${BASH_REMATCH[0]})中捕获))
对多行变量稍作修改:
$ echo ${qout)
this is unrouted 0 0 running
dead-letter 0 0 running注释:我在第一行添加了'this is‘前缀,这样我们就可以验证解析从哪里开始。
一个想法-借用这个答案(shell regex to end of line):
$ sfx=$'[^\n]*' # match up to first newline (`\n`) character;
# must use single quotes;
# double quotes will cause the `\n` to be evaluated as the character `n`
$ [[ $qout =~ ${q}${sfx} ]] && echo 'match'
match
$ echo "${BASH_REMATCH[0]}"
unrouted 0 0 runningFWIW,将测试/echo包装在set -/+ xv中显示:
$ [[ $qout =~ ${q}${sfx} ]] && echo 'match'
+ [[ this is unrouted 0 0 running
dead-letter 0 0 running =~ unrouted[^
]* ]]
+ echo match
match将@David C.Rankin的评论添加到混合中(将\n直接放在正则表达式中):
$ [[ $qout =~ ${q}[^$'\n']* ]] && echo 'match'
match
$ echo "${BASH_REMATCH[0]}"
unrouted 0 0 running备注:如果大卫想发布他自己的答案,我可以删除它。
https://stackoverflow.com/questions/64082165
复制相似问题