如何使用 sed 或任何其他工具提取文件中的数字?

Jim*_*Jim 5 sed text-processing regular-expression

我有一个具有这种格式的文件

[ 2014/05/01 10:48:26 | 13963 | DEBUG ] 完成这个过程用了 11.16837501525879 秒

所以我有成千上万这样的行,我想“提取” 我尝试过的11.16837501525879部分

 sed -e 's/^.* (\d+\.\d*)/\1/g' logfile.txt > out.txt  
Run Code Online (Sandbox Code Playgroud)

但我得到:

sed: -e expression #1, char 21: invalid reference \1 on `s' command's RHS  
Run Code Online (Sandbox Code Playgroud)

我能在这里做什么?

ter*_*don 8

sed默认情况下使用基本正则表达式,BRE 不知道\d. 以下是一些其他方法:

  1. sed

    sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    -r需要,以避免对括号进行转义。

  2. perl

    perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)
  3. grep

    grep -Po '.* \K\d+\.*\d*' logfile.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

这些都使用您的基本方法,即填充查找行中以空格开头的所有数字集。根据行上可以出现多少组数字,如果您的输入行始终采用您显示的格式,则更安全的方法是:

grep -Po 'took \K\d+\.*\d*' logfile.txt 
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 4

sed 中分组括号必须加反斜杠。另外,sed 不支持\d. 此外,您还应该删除数字后面的文字:

sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*/\1/g'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您确定点总是存在,但小数是可选的吗?12.似乎不是预期值。