regex - 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,})$"
谢谢你。
解决方案
首先,您不能在 Bash 中使用“Perl 风格”的简写,例如\d
and 。\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...
推荐阅读
- angular - 如何使用 Angular 6 工作的 ngModel 创建自定义输入组件?
- reactjs - Why there are 2 then blocks in fetch call in React?
- javascript - 使用数组创建 div
- python - 代码不起作用树 BFS 搜索
- google-bigquery - 如何在 BQ 中将数据插入包含结构数据类型的表中
- r - LaTeX 表格中的链接文本与 knitr/kable
- python - 如何根据排序算法在熊猫上获得获胜者选民
- r - 输出PDF时如何将Bookdown中的二级标题对齐?
- dart - ListView 未使用 StatefulWidget 重新加载
- java - 如何使用 Selenium WebDriver 检查单选按钮 从 excel 读取数据