Bash脚本-返回Regex捕获组内容



我正在寻找一种能够在Bash脚本中解析字符串的方法。这是测试字符串:

test="+----------+ | count(4) | +----------+ | 0 | +----------+"

我试着用Sed这样做:

echo $(echo $test | sed -r 's/|s(d+)s|/1/')

这将返回整个测试字符串。

使用原始Bash脚本:

pattern='|s(d+)s|'
if [[ "$test" =~ $pattern ]]
then
echo "${BASH_REMATCH[1]}"
fi

这不会返回任何内容。

我做错了什么?如何做到这一点?

您需要将整个字符串与正则表达式模式匹配,将-n选项与p标志一起使用,并使用[0-9]/[[:digit:]]来匹配数字,因为POSIX正则表达式不支持d简写:

sed -rn 's/.*s([0-9]+)s.*|/1/p' <<< "$s"

如果sed不支持s,请改用[[:space:]]/[[:blank:]]POSIX字符类。

这里,

  • n-抑制默认行输出
  • .*-匹配任何零个或多个字符
  • s/[[:space:]]-空白
  • ([0-9]+)-捕获与一个或多个数字匹配的组
  • s/[[:space:]]-空白
  • .*-任意零个或多个字符
  • 1-将整个匹配替换为组1的内容
  • p-打印替换的结果

请参阅联机sed演示。

您拥有的Bash代码包含两个问题:管道字符在POSIXERE标准中是特殊的(默认情况下在Bash中使用(,您需要对它们进行转义以匹配为文本管道字符。此外,您需要将d更改为[[:digit:]][0-9]:

pattern='|s([0-9]+)s|'

查看Bash在线演示。同样,如果不支持s,请使用[[:space:]]

最新更新