grep regex忽略中间部分

时间:2018-11-05 06:17:46

标签: regex grep

我有一个这样的收件人名称文件

致:约翰·史密斯(约翰尼)

收件人:简·多伊(jane)

致:Richard Larach(迪克)

我希望匹配项仅返回昵称:

强尼

jane

迪克

我正在尝试使To:和(正则表达式匹配)(忽略中间部分,如果匹配则仅输出昵称。

我尝试过

grep -e "To:*\("
grep -e "To: * \("
grep -e /To: * \(/

我不确定问题是否出在空格,还是我在其他地方搞砸了。我也不能只匹配((因为(

3 个答案:

答案 0 :(得分:1)

如果只需要昵称部分,请尝试以下命令:

sed "s/.*(\(.*\))$/\1/g" input_filename

这仅在有一对()的情况下有效。如果是多对,请使用cut(鉴于行以昵称结尾

rev input_filename | cut -d \( -f1 | cut -d \) -f2 | rev

如果您还有其他模式要求您在输入中添加更多样本

答案 1 :(得分:0)

grep命令只是文本文件行的过滤器,因此它仅选择和输出匹配的整行;要切出所需的片段,您需要“ sed”,(或者更好的是,切换到perl)。

grep "To:[^(]*(${nickname})"匹配您想要的昵称。

sed 's/To:[^(]*(\([^)]*\))/\1/g'实际上将所有完整条目替换为昵称。

在这里,“ [^(]*”和“ [^)]*”部分表示不包含左括号和右括号的任何字符串。

这就是您想要的吗?

答案 2 :(得分:0)

如果可以选择使用gnu grep,则可以使用\K来忘记先前匹配的内容,而使用正向超前的(?=来断言后面是括号。

grep -Po '\bTo:.*?\(\K[^()]+(?=\))' inputfile