正则表达式将 grep 特定字符串后的数字

正则表达式将 grep 特定字符串后的数字

所以我有一句话:

ID: 54376

你能帮我制作一个只返回不带“ID:”的数字的正则表达式吗?

笔记:该字符串位于一个文件中。

答案1

尝试这个:

grep -oP '(?<=ID: )[0-9]+' file

或者:

perl -nle 'print $1 if /ID:.*?(\d+)/' file

答案2

许多这样做的方法。例如:

  1. 将 GNUgrep与最近的 PCRE 结合使用并匹配后面的数字ID:

    grep -oP 'ID:\s*\K\d+' file
    
  2. 使用awk并简单地打印以以下开头的所有行的最后一个字段ID:

    awk '/^ID:/{print $NF}' file
    

    这也将打印不是数字的字段,但要仅获取数字,并且仅在第二个字段中,使用

    awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
    
  3. 使用带有扩展正则表达式的 GNU grep 并解析它两次:

    grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
    

答案3

使用egrepwith-ogrepwith-Eo选项仅获取匹配的段。使用[0-9]正则表达式来获取数字:

grep -Eo [0-9]+ filename

答案4

使用 sed:

{
    echo "ID: 1"
    echo "Line doesn't start with ID: "
    echo "ID: Non-numbers"
    echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'

-n“默认情况下不打印任何内容”,是/^ID: [0-9][0-9]*$/“与此正则表达式匹配的行”(以“ID:”开头,然后是 1 个或多个数字,然后是行尾),是s/ID: //p的形式s/pattern/repl/flags-s意味着我们正在做替代,用"ID: "替换文本替换模式""(空字符串)p,这意味着“在替换后打印此行”。

输出:

1
4

相关内容