首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组grep命令

组grep命令
EN

Unix & Linux用户
提问于 2019-10-24 10:51:00
回答 2查看 410关注 0票数 3

我希望grep文件名不是以s开头,而是包含一个m

我尝试过这样的解决方案:

代码语言:javascript
复制
ls | grep -Ev "^s" | grep "m"

但是,当我尝试使用单个grep命令执行时,它会失败:

代码语言:javascript
复制
ls | grep -E '^[^s]*m*'

我无法解释原因。只使用一个grep命令就可以做到这一点吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-10-24 11:01:28

我认为您在正则表达式中使用*不正确。

规范(参见。此外,grep的手册还指出:

代码语言:javascript
复制
*      The preceding item will be matched zero or more times.

因此,您的正则表达式将意味着:“匹配任何以字母s开头的任何文件名,这个值为零或多次,然后是字母m的0倍或更多倍。”

正则表达式应该改为

代码语言:javascript
复制
ls | grep -E '^[^s][[:alnum:]]*m'

也就是说,您必须在“m”之前指出哪个符号应该是0次或多次,在您的情况下,任何字母数字字符都应该是可以的。如果您的文件名可以包含-_,那么将[[:alnum:]]替换为[[:print:]]

作为一种极端情况,如果您的文件名也可以以m开头,那么regexp将是

代码语言:javascript
复制
ls | grep -E '(^m|^[^s][[:print:]]*m)'
票数 0
EN

Unix & Linux用户

发布于 2019-10-24 11:24:09

首先,您不应该解析ls的输出。撇开这一点,我将回答你关于grep的问题。

如果您坚持使用grep,那么您想要的是:

代码语言:javascript
复制
grep -E "^[a-rt-zA-RT-Z][[:alnum:]]*m" file

事实上,它甚至在没有-E的情况下工作:

代码语言:javascript
复制
grep "^[a-rt-zA-RT-Z][[:alnum:]]*m" file 

它将打印任何以sS以外的任何字符开头的内容,然后打印包含m的任何字母数字字符,以及其后的任何字符,无论它们是否为m。实际上,它给出了您要寻找的输出。

在处理文件时,上面的第一个printf解决方案要好得多,因为它不需要解析ls。您可以在上面的文件名中使用grep,但我建议您不要使用它,并建议在标准输出中的文件或数据内容中使用它。

您也可以对文件使用find,因为它不需要被解析:

代码语言:javascript
复制
find /path/to/directory -type f -name "*m*" -name "[!s]*"

根据您的环境,您可能需要转义*

代码语言:javascript
复制
find /path/to directory -type f -name "\*m\*" -name "'[!s]\*"
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/548512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档