Grep具有特定下划线图案的文件名

时间:2016-06-28 15:00:06

标签: regex linux bash grep redhat

我试图使用egrep和regex从文件中获取模式但没有成功。

我需要的是获取一个例如约定名称为

的文件
xx_code_lastname_firstname_city.doc

代码应至少有3位数字,姓氏和名字以及城市的大小可能会有所不同

我正在尝试下面的代码,但它无法实现我的目标:

ls -1  | grep -E "[xx_][A-Za-z]{3,}[_][A-Za-z]{2,}[_][A-Za-z]{2,}[_][A-Za-z]{2,}[.][doc|pdf]"

那是试图从开始获取标准xx_,然后是任何至少有3个单词的代码,之后它必须有另一个下划线,依此类推。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:5)

考虑一个extglob,如下:

#!/bin/bash
shopt -s extglob # turn on extended globbing syntax

files=( xx_[[:alpha:]][[:alpha:]]+([[:alpha:]])_[[:alpha:]]+([[:alpha:]])_[[:alpha:]]+([[:alpha:]])_[[:alpha:]]+([[:alpha:]]).@(doc|docx|pdf) )

[[ -e ${files[0]} ]] || -L ${files[0]} ]] && printf '%s\n' "${files[@]}"

这是因为

[[:alpha:]][[:alpha:]]+([[:alpha:]])

...匹配三个或更多字母字符的任意字符串 - 其中两个显式字符串,其中一个字符串使用+()一个或多个extglob语法。

类似地,

@(doc|docx|pdf)

...匹配这三个特定字符串中的任何一个。

答案 1 :(得分:3)

所以你要尝试匹配文字xx_?然后用那个部分开始你的模式。

xx_

接下来是" 3位"你正试图匹配。我将假设基于你自己的正则表达式,通过"数字"你的意思是字符(因此[a-zA-Z]字符类)。让我们使量词非贪婪,以避免任何无意识的捕获行为。

xx_[a-zA-Z]{3,}?

对于firstname和lastname部分,我看到你指定了一个至少包含2个字符的变量长度。让我们通过在量词之后附加?字符来确保这些量词也是非贪婪的。根据你的正则表达式,看起来你期望你的城市构造采用与名字和姓氏相似的形式。让我们再添加三个。

xx_[a-zA-Z]{3,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}\.

注意:我们并不需要让城市量词非贪婪,因为我们断言它后面跟着文字".",我们不希望出现在任何地方在文中我们对匹配感兴趣。请注意它是如何转义的,因为它是正则表达式语法中的元字符。

最后是文件扩展名,您的示例为"docx"。我还看到你在正则表达式中添加了"doc""pdf"扩展名。让我们结合所有这三个。

xx_[a-zA-Z]{3,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}\.(docx?|pdf)

希望这有效。如果您需要任何澄清,请评论。注意"doc""docx"部分是如何压缩成一个元素的。这不是必要的,但我认为这种形式看起来更有意思。它也可以写成(doc|docx|pdf)。对我的品味有点重复。