首页 > 解决方案 > Bash 兼容的正则表达式(带组)

问题描述

我正在尝试用正则表达式做一个简单的脚本。此正则表达式适用于文本编辑器和在线正则表达式检查器。但我找不到如何让它在 bash 上工作。

顺便说一句,我需要捕获组。

示例文本:

2020-03-06 10:00:07 Test2: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...
2020-03-06 10:00:13 Test2: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...

这是我的脚本。它读取每一行并创建一个名为 DATE_HOUR.xml 的文件,其中填充了文本直到行尾(格式化后):

#!/bin/bash
: ${1?"USO: $0 NOMBRE-DEL-ARCHIVO"} #If no args passed

regex="^(\d*-\d*-\d*)\s(\d*:\d*:\d*)\s(\w*): (.*)$" #This one is working on editors

mkdir -p out
while read line
do
   if [[ $line =~ $regex ]] #IT NEVER ENTERS HERE
    then
        date="${BASH_REMATCH[1]}"   #DATE
        time="${BASH_REMATCH[2]}"   #TIME
        time="${time/:/-}"          #REPLACE : with -
        name="${BASH_REMATCH[3]}"   #I DO NOT USE IT BY NOW
        text="${BASH_REMATCH[4]}"   #TEXT
        echo $text | xmllint --format - > out/$date"_"$time.xml
    fi
done < $1

我试过这个正则表达式,但它肯定有错误:

regex="^([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}) ([[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}) ([[a-zA-Z0-9]]{1,}): (*{1,})$"

谢谢你。

标签: regexbash

解决方案


首先,您不能在 Bash 中使用“Perl 风格”的简写,例如\dand 。\s您的最后一次尝试很接近,但包含一些错误,例如[[a-zA-Z0-9]](应该只有一对[])和*{1,}(不是 100% 清楚它的作用,但它不是您想要的!)。

可以改用此模式:

regex='([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([a-zA-Z0-9]+): (.*)'

[0-9]用来匹配数字 - 您可以[[:digit:]]改用,但看起来您不需要支持 range 之外的任何字符0-9。我还\s用一个简单的空格替换(如果可能[[:blank:]]的话,你可以用它来匹配空格或制表符)。

关于锚点^$,您可能不需要它们:

  • ^仅当您想避免与模式匹配但以它开头的行时才需要(看起来您的所有行都以它开头,在这种情况下不需要这样做)
  • $无关紧要,因为您的模式以它结束,.*这将消耗整个行的其余部分

测试一下:

$ line='2020-03-06 10:00:07 Test2: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...'
$ regex='([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([a-zA-Z0-9]+): (.*)'
$ [[ $line =~ $regex ]] && echo yes
yes
$ printf '%s\n' "${BASH_REMATCH[@]}"
2020-03-06 10:00:07 Test2: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...
2020-03-06
10:00:07
Test2
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...

推荐阅读