我已经广泛搜索过,无法弄清楚我在这里做错了什么。我有一个文本文件,可能包含类似于以下内容的字符串:
public ActionResult Index(string typeControl, int? id_pred)
{
var node = MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("typeControl");
if (node != null)
{
node.RouteValues["typeControl"] = typeControl;
}
...
我通常知道直到磁盘百分比指示符(即11%)之前的sting会是什么样的,但是在字符串的最后部分我需要弄清楚它是否在usr(或sub)目录中结束。 / p>
我想使用grep进行此搜索但遇到问题。例如,以下命令为我提供输出,但一旦我替换任何“。” “G”或“%”的字符,或者如果我尝试在最后添加“/usr/.*”,则拒绝返回任何内容。
/dev/dir1/dir2 200G 22G 179G 11% /usr/dir3/dir4
答案 0 :(得分:1)
grep
的扩展正则表达式不支持使用\d
来匹配数字。相反,请使用[0-9]
或[:digit:]
。您可以使用以下grep
命令:
egrep '^/dev/dir1/dir2\s*[0-9]*G\s*[0-9]*G\s*[0-9]*G\s*[0-9]*%\s*.*$'
您还可以通过grep
-P
选项启用与Perl兼容的正则表达式,这些表达式支持\d
:
grep -P '^/dev/dir1/dir2\s*\d*G\s*\d*G\s*\d*G\s*\d*%\s*.*$'
注意在上面的命令中使用grep
而不是egrep
; -P
与egrep
不兼容。
作为旁注,我倾向于尽可能使用+
而不是*
,因为它更严格,可能会导致错误更快地显现出来。例如,我假设输入中的每个位置始终至少有一个空格和一个数字,因此您可以使用\s+
和[0-9]+
(或\d+
)。如果您的原始模式使用了+
,那么它首先就不会匹配(无论是否引用),并且您甚至在添加G
之前就已经知道您遇到了问题或%
到它。一个工作的例子是
egrep '^/dev/dir1/dir2\s+[0-9]+.\s+[0-9]+.\s+[0-9]+.\s+[0-9]+.\s+.+$'