用冒号匹配两位数

时间:2017-10-30 13:27:22

标签: regex bash

我希望匹配文件index.txt导致的2位数字(30:02:40),但是如果条件允许我会坚持,我不知道如何比较结果并做一些事情。

index.txt

<tr><td>device</td> <td>10.10.10.1</td> <td>64232</td> <td>1</td> <td bgcolor=Red>30:02:40</td><tr>

script.sh

#!/bin/bash
output=$(cat index.txt |  sed -e 's/>/ /g;s/</ /g'| awk '{print $16}')
if [ $output == '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ]; then
        echo "successful"
else
        echo "$output"
fi

TX

4 个答案:

答案 0 :(得分:1)

您有两个问题:

  • 单方括号测试无法处理这些类型的通配符,但您可以使用带双括号的扩展测试命令。
  • 单引号标记表示您的通配符被忽略,字符串被视为逐字。

通过这两个调整,它可以工作:

if [[ $output == [0-9][0-9]:[0-9][0-9]:[0-9][0-9] ]]; then
    echo "successful"
else
    echo "$output"
fi

答案 1 :(得分:1)

xmlstarlet / xmllint是处理XML / HTML数据的正确工具 (对于xmlstarlet:唯一要求是您的内容应该是有效的HTML / XML文档/片段):

cdo monmean in.nc out.nc

输出:

xmlstarlet sel -t -v "//tr/td[@bgcolor='Red']" -n \
<(sed -E 's/([^[:space:]=<>]+=)([^[:space:]=<>]+)/\1"\2"/g; s/<tr>$/<\/tr>/' index.txt)

xmllint 方法:

30:02:40

答案 2 :(得分:1)

为什么不在awk中进行匹配,而不仅仅是{print $16}

... | awk '$16~/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/{print "successful"; exit} {print $16}' 

您还可以通过设置正确的分隔符将第一个sed合并到此中,但需要更好地了解结构以确定所需的字段。

答案 3 :(得分:-1)

是的,某些html解析器会更好,但纯粹的bash解决方案可能是:

grep -oP "\d+:\d+:\d+" index.txt