2013-03-14 66 views
3

我需要在我决定的分隔符后返回所有内容,但仍不完全知道如何使用sed。 我需要做的是:Bash Shell - 第二次出现特定字符后的返回子字符串

$ echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," \ 
    | sed <some regexp> 

在这个例子中返回的应该是(子)一切第二个逗号后:

123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,, 

我可以这样用切做到这一点: echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," | cut -d',' -f 2

但我已经被告知剪切速度比sed慢...

有些古鲁人有他们(并且想要:))请给我几分钟的时间,并给我建议? 谢谢! 狮子座

+5

我不知道'cut'比'在这种特殊情况下sed'慢,但我可以告诉你,'cut'并不比'sed'慢'“,足以产生任何实际的区别。如果速度那么重要,你不会在Bash处理这个,对吧? – 2013-03-14 11:48:03

+0

感谢Will,我会在哪里处理它,然后如果速度是最重要的? – Leo 2013-03-14 11:51:33

+0

如果速度真的很重要,你可以用C编写它,它可能比使用'cut'快0.002%,这反过来会比'sed'快得多。 – 2013-03-14 12:03:15

回答

0

以我的经验cut总是比sed更快。

做你想要与sed你可以使用非匹配组:

echo 'ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' | 
    sed -r 's/([^,]*,){2}//' 

这消除了前两个字段(如果字段不包含逗号本身)通过消除非逗号字符[^,]随后逗号两次{2}

输出:

123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,, 
+0

非常感谢Thor!这正是我想要的sed。我会试着用一些大文件来看看哪一个更快。 – Leo 2013-03-14 12:01:43

0

您也可以尝试做与萃取bash没有产卵外部进程可言:

$ [[ 'ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' =~ [^,]*,[^,]*,(.*) ]] 
$ echo "${BASH_REMATCH[@]}" 
123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,, 

$ FOO='ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' 
$ echo ${FOO/+([^,]),+([^,]),} 

$ IFS=, read -a FOO <<< 'ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' 
$ echo ${FOO[@]:2} 

(假设这是一个一次性的比赛,而不是遍历一个文件的内容。)

相关问题