我有一个这样的收件人名称文件
致:约翰·史密斯(约翰尼)
收件人:简·多伊(jane)
致:Richard Larach(迪克)
我希望匹配项仅返回昵称:
强尼
jane
迪克
我正在尝试使To:和(正则表达式匹配)(忽略中间部分,如果匹配则仅输出昵称。
我尝试过
grep -e "To:*\("
grep -e "To: * \("
grep -e /To: * \(/
我不确定问题是否出在空格,还是我在其他地方搞砸了。我也不能只匹配((因为(
答案 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