我有一个文件,内容如下:
Change 305034 on 2017/04/26 by jdoe@BP
Change 304966 on 2017/04/26 by adoe@adoe
Change 304880 on 2017/04/25 by cm@cpu_jar_process_main_8.30.0.9
Change 304843 on 2017/04/25 by mdoe@BP
我需要选择其中包含cm@
的行。我已经生成了一个匹配它的正则表达式。
Change\s[0-9]+\son\s[0-9]{4}\/[0-9]{2}\/[0-9]{2}\sby\scm
我测试了它https://regex101.com/
,它运行正常。
现在我想使用shell脚本来进行匹配。该脚本如下 -
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
# echo "Text read from file: $line"
# Change\s[0-9]+\son\s[0-9]{4}\/[0-9]{2}\/[0-9]{2}\sby\scm"
if [[ "$line" =~ "Change\s[0-9]+\son\s[0-9]{4}\/[0-9]{2}\/[0-9]{2}\sby\scm" ]]; then
echo $line
fi
done < "output.txt"
但它与任何一条线都不匹配。
我发现如果我使用if [[ "$line" =~ "Change" ]]; then
,它会返回结果。但是当我使用完整的正则表达式模式时没有结果。我假设存在语法错误。
有人可以指出我做错了什么吗?
答案 0 :(得分:1)
if [[ "$line" =~ 'Change\s[0-9]+\son\s[0-9]{4}\/[0-9]{2}\/[0-9]{2}\sby\scm' ]]; then
^ ^
| |
`- Use single quotes to avoid escaping interpretation -'
答案 1 :(得分:1)
如果您的输入文件包含类似Change 305034 on 2017/04/26 by ...
类似格式的行 - 那么 awk 解决方案非常简短:
awk '$6~/^cm@/' output.txt
输出:
Change 304880 on 2017/04/25 by cm@cpu_jar_process_main_8.30.0.9