我想知道为什么我这样做不起作用:
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/'
任何帮助将不胜感激。
答案 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}'