【问题标题】:match to end of line in bash regex with =~使用 =~ 匹配 bash 正则表达式中的行尾
【发布时间】:2020-09-26 20:20:03
【问题描述】:

我正在尝试使用 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

我做错了什么?

【问题讨论】:

  • 如果您不必使用 bash,功能更强大的脚本语言可能会帮助您完成这项工作!
  • @ti7,bash 具有此任务所需的所有功能。
  • if [[ $qout =~ ${q}[^$'\n']* ]] ; then

标签: regex bash match


【解决方案1】:

[\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

...作为输出发射:

declare -ar BASH_REMATCH=([0]=$'unrouted    0   0   running\n')

【讨论】:

  • Bash 甚至会使用$q[^$'\n']+ 作为正则表达式。我之前没有在列表中尝试过字符文字...
  • 不需要字符类:a=$'hello\nworld'; [[ $a =~ (.*)$'\n'(.*) ]]; typeset -p BASH_REMATCHdeclare -ar BASH_REMATCH=([0]=$'hello\nworld' [1]="hello" [2]="world")
【解决方案2】:

假设:

  • 从多行变量 (qout) 中提取包含模式 (q) 的行
  • 从模式 (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   running

FWIW,将 test/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

注意:如果大卫想发表他自己的答案,我可以删除它。

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多