首页 > 解决方案 > grep - 模式作为变量

问题描述

文件名:Data.txt

在这个文件里面:

...
3754  Skype Helper    
375  Skype Helper    
37  Skype
... 

文件名:shell.sh

#!/bin/bash

IFS='
'
var="Skype"

grep "\d\+\s\+${var}$" /Users/run/Documents/Data.txt >> /Users/run/Documents/output.txt 

输出应该是:

37  Skype

我得到:

3754  Skype Helper    
375  Skype Helper    
37  Skype 

非常感谢

标签: regex

解决方案


您正在使用不支持 PCRE (Perl-like) 的 BRE POSIX 模式\d\s您可以\d[0-9]括号表达式和\sPOSIX[[:space:]]字符类替换:

grep "[0-9]\+[[:space:]]\+${var}\$"

请注意,您可以转义最后一个$以使其成为明确的文字美元符号,但这不是必需的,因为尾随的美元被正确解析为字符串符号的结尾,这也可以:

grep "[0-9]\+[[:space:]]\+${var}$"

如果您不想过度转义,可以使模式 POSIX ERE 兼容:

grep -E "[0-9]+[[:space:]]+${var}$"
     ^^

您实际上可能会继续使用\d\s如果您告诉grep使用 PCRE 正则表达式引擎来解析模式:

grep -P "\d+\s+${var}$"
     ^^

请参阅在线演示


推荐阅读