Sed提取物第二个字

时间:2011-07-22 22:56:58

标签: regex sed terminal

我想知道为什么我这样做不起作用:

echo "d_suites/k_val/tests/asm/logs/kf_on_stage1 FAILED 0:00:22 Jul 22 22:33 " | 
    sed 's/[ \t]*\([^ \t]+\)[ \t]+\([^ \t]+\).*/\2/'

但是这个(改变+到*)有效:

echo "d_suites/k_val/tests/asm/logs/kf_on_stage1 FAILED 0:00:22 Jul 22 22:33 " |
     sed 's/[ \t]*\([^ \t]*\)[ \t]*\([^ \t]*\).*/\2/'

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

默认情况下,Sed不支持+通配符。

$ echo "aaabbbccc" | sed "s/a+/XXX/g"
aaabbbccc

您可以使用-r标记(on GNU sed)或-E标记(在Mac OS X上,我怀疑,* BSD sed)启用它,因为这些选项启用了使用扩展正则表达式(与基本正则表达式相对):

$ echo "aaabbbccc" | sed -E "s/a+/XXX/g"
XXXbbbccc

如果你使用GNU sed,supports +作为基本正则表达式模式中的转发器,如果​​你用反斜杠转义它:

$ echo "aaabbbccc" | sed "s/a\+/XXX/g"

答案 1 :(得分:1)

第一个不起作用,因为你需要逃避你的+,像这样:

echo "d_suites/k_val/tests/asm/logs/kf_on_stage1 FAILED 0:00:22 Jul 22 22:33 " | 
    sed 's/[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\).*/\2/'

修改

有关原因的详细信息,请阅读this very informative comment

答案 2 :(得分:0)

已编辑 - 现在引用[^ \t]

[^ \t]+是1-n标签,要求有非标签。
[^ \t]*是0-n标签,不需要是非标签。

在输入字符串中有非标签

答案 3 :(得分:0)

如果你没和sed完全结婚,awk会更具可读性:

echo "..." | awk '{print $2}'