2012-11-06 25 views
2

我試圖提取單個串出具有在鍵值順序多段線,但作爲它匹配比我多我不明白這一點想要。獲取的一行發生多次兩個字符之間的字符串

這是我的示例行:

|SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~|SEGB~34~12.11.2011~3~M~O~|SEGC~HELLO~WORLD~| 

此行是許多領域的一種串聯成一條線。現在我想提取以SEGA開頭的段索引2中的字符串。 所以我要做的就是爲這個grep的:

egrep -o 'SEGA(.*?)\~\|' 

但它給我的整條生產線,有時它給我的只有我找段。在比賽中,我會使用〜字符來分割該段,然後拿第三段。 由於我使用。*?問號我預期的egrep只匹配SEGA和最先出現的內容〜|這是正確的,在SEGB之前,而不是在SEGC或SEGB結束之前。

我怎麼能告訴grep來搜索SEGA並給整個內容SEGA開始之後,直到〜的最初發生|

回答

2

您可以使用的grep的-P(--perl-正則表達式)選項:

grep -oP '(?<=SEGA).*?(?=~\|)' file 

如果要包括尾隨~|,請刪除超前(?=...)

我覺得.*?(懶惰)不退出在egrep的。

+0

好吧似乎-P選項幫我擺脫困境。因爲我有和grep一樣的正則表達式,但是它沒有匹配就終止了。現在,它的工作,謝謝。 – NovumCoder

0

我建議你打破行成上|線,然後從那些用grep:

$ echo "|SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~|SEGB~34~12.11.2011~3~M~O~|SEGC~HELLO~WORLD~|" | sed -e 's/|/\n/g' | grep ^SEGA 
SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~ 
相關問題