如何形成正确的正则表达式以捕获括号前的所有内容?

时间:2013-07-02 14:41:33

标签: regex bash sed

当前我有一组格式为

的字符串
customName(path/to/the/relevant/directory|file.ext#FileRefrence_12345)

从这里我可以使用sed提取customName,即第一个括号前的字符。

到目前为止,我最好的猜测是:

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

然而,使用这些我得到错误:

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

那我该如何形成正确的正则表达式呢?为什么我没有匹配的\是相关的\(它只是我的表达式的转义字符,而不是用于格式化的字符?

3 个答案:

答案 0 :(得分:2)

您可以替换左括号后的所有内容,如下所示(请注意,默认情况下括号不需要在sed中转义)

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

答案 1 :(得分:2)

<强>的grep

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

<强> SED

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

注意我更改了括号之间的内容。

答案 2 :(得分: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