2013-03-14 65 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} 

(假設這是一個一次性的比賽,而不是遍歷一個文件的內容。)

相關問題