2013-07-02 46 views
0

目前我有屬於格式如何在括號之前形成正確的正則表達式來捕獲所有內容?

customName(path/to/the/relevant/directory|file.ext#FileRefrence_12345) 

的從這一組字符串我想提取customName,第一個括號之前的字符,使用SED。

我最好的猜測至今都:

echo $s | sed 's/([^(])+\(.*\)/\1/g' 
echo $s | sed 's/([^\(])+\(.*\)/\1/g' 

然而,使用這些我得到的錯誤:

sed: -e expression #1, char 21: Unmatched (or \(

那麼,如何形成正確的正則表達式?爲什麼它是相關的,我沒有匹配\(它只是一個逃跑的字符爲我的表達式,而不是一個字符用於格式化?

+2

小心,在'sed','('是字面括號,和'\('開始捕獲組,而不是相反 –

+0

啊精彩感謝@TimPietzcker。! ,這清理了很多 – Matt

回答

2

你可以替代開頭括號後的所有內容,像這樣(注意默認情況下,括號不需要sed轉義)

echo 'customName(path/to/the/relevant/directory|file.ext#FileRefrence_12345)' | 
sed -e 's/(.*//' 
+0

我可能對sed的部分工作有誤解,不應該因爲它們發信號分組而需要轉義,比如在命令的/(需要)le/\ 1/g'中,我認爲將「針」替換爲「需要」 – Matt

+0

解決了對原始問題的評論。感謝您的幫助! – Matt

+0

@Matt,請參閱[sed正則表達式](http://www.gnu.org/software/sed/manual/html_node/) Regular-Expressions.html)。分組使用'\(group \ )'grep'爲' – iruvar

2

grep的

kent$ echo "customName(blah)"|grep -o '^[^(]*' 
customName 

sed的

kent$ echo "customName(blah)"|sed 's/(.*//' 
customName 

注意我更改了括號之間的內容。

+0

+1,沒有那件事。順便說一句,很高興再次見到你。 – fedorqui

+0

+1,有幫助的回覆 – Matt

+0

@fedorqui thx。 ;) – Kent

1

不同的選項:

$ echo $s | sed 's/(.*//'   #sed (everything before "(") 
customName 
$ echo $s | cut -d"(" -f1   #cut (delimiter is "(", print 1st block) 
customName 
$ echo $s | awk -F"(" '{print $1}' #awk (field separator is "(", print 1st) 
customName 
$ echo ${s%(*}      #bash command substitution 
customName 
+0

+1,有幫助的回覆 – Matt

相關問題