正则表达式匹配文件中的行

时间:2017-04-27 08:04:55

标签: regex shell

我有一个文件,内容如下:

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,它会返回结果。但是当我使用完整的正则表达式模式时没有结果。我假设存在语法错误。

有人可以指出我做错了什么吗?

2 个答案:

答案 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