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)
我能在这里做什么?
sed
默认情况下使用基本正则表达式,BRE 不知道\d
. 以下是一些其他方法:
sed
sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)
的-r
需要,以避免对括号进行转义。
perl
perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)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)
sed 中分组括号必须加反斜杠。另外,sed 不支持\d
. 此外,您还应该删除数字后面的文字:
sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*/\1/g'
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您确定点总是存在,但小数是可选的吗?12.
似乎不是预期值。