2014-07-11 90 views
0

我需要用sed做一件非常簡單的事情:我需要從這個字符串HEAD detached at 19d7ea9中獲取提交散列。爲什麼sed正則表達式替換不起作用?

這是我在它試圖用sed

echo "HEAD detached at 19d7ea9" | sed 's/HEAD\ detached\ at\ \(.\+\)/\1/' 

然而,該命令是行不通的,而我不能完全弄清楚爲什麼。我知道我可以做到與sed 's/HEAD\ detached\ at//不同,並有相同的結果。但我似乎無法弄清楚爲什麼第一種方法不起作用。

任何答案將不勝感激。這是我第一次使用sed(我知道我遲到了派對),所以請不要錯過。


編輯:感謝所有的答案。這似乎是使用-E標誌是解決這個問題最直接的方法。

我試圖按照@ ooga的答案與另一個例子,但也失敗了。再次,我無法弄清楚我在做什麼錯在這裏:

例2: 我想看看回購是遠在前面還是後面,以及多少次提交。這是我的代碼

status="On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to..." 

echo $status | sed -E 's/Your branch is (ahead|behind).+([0-9]+) comm)/\2 \1/' 

有關此主題的任何進一步的幫助表示讚賞。我想知道爲什麼我無法得到這整個sed業務的權利。

+0

試試這個:'sed的 '(。* \)S/HEAD在\分離/ \ 1 /'' – anubhava

+2

你爲什麼要逃離空間? –

+0

你知道你使用的是什麼版本的sed嗎? –

回答

3

-E標誌(在OSX上或GNU上的-r標誌)使用「擴展」(現代)正則表達式語法。這樣,你不僅有+量詞,但你不需要在它或括號前面使用反斜槓。

sed -E 's/HEAD detached at (.+)/\1/' 
+0

事實上,在擴展ERE的情況下,在括號之前沒有太多「不需要使用」作爲「不得使用」反斜槓,因爲括號中的括號意味着尋找文字括號。 –

+0

謝謝,這似乎解決了這個問題。 –

1

看來,+是不是在POSIX Basic Regular Expression有效的量詞,但*是,所以下面的作品,應該可以移植到OS X.

echo "HEAD detached at 19d7ea9" | sed 's/HEAD detached at \(.*\)/\1/' 
2

你有你的答案有關的sed版本,但FWIW在AWK你只要告訴它打印就行了最後一個空格分隔的字段:

awk '{print $NF}' file 
+1

哇!這真的很整潔優雅! –

相關問題