我试图使用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个单词的代码,之后它必须有另一个下划线,依此类推。 有人可以帮忙吗?
答案 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)
。对我的品味有点重复。