使用 grep 检测行尾的模式

使用 grep 检测行尾的模式

如果我做:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part

如果我只想列出文件.rar,我使用grep,它也会向我显示.rar.part文件,这不是我的愿望。
我正在使用findls **/*.rar按照中所述解决这个问题这个线程它们工作得很好,但我想了解是否可以通过grep.

我已经尝试过(思考EOL):

ls -R | grep ".rar\n"

没有结果。
我认为问题在于发现greping是否被发现在该行的末尾,但我不确定。

请问这里有什么帮助吗?

答案1

锚点$与行尾匹配。

ls -R | grep '\.rar$'

您也可以用于find此目的:

find . -name '*.rar'

答案2

除了您的问题之外,请注意,它.rar不仅匹配“.rar”,还匹配 .rar.之前的每个字符(包括 )rar。在这种情况下可能不是问题,但.必须在正则表达式中转义。

ls -R | grep "\.rar$"

答案3

您还可以指示grep从单词边界开始查找字符串。之间存在这样的边界.(a非词字符)和r(一个单词特点)。根据您的grep实现,单词边界运算符可以是\b或可能是\<[[:<:]](仅单词的左侧边界)\>[[:>:]](右侧)。

$ ls -R | grep '\brar$'

例子

假设我有这个样本数据。

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part

此命令将仅查找具有扩展名的文件.rar

$ ls -R | grep '\brar$'
afile.rar

这是如何运作的?

元字符\b是一个锚点,就像插入符号和美元符号一样。它在称为“单词边界”的位置进行匹配。该匹配的长度为零。

这不起作用的情况

如果您有名为blah-rar这些的文件,也会被检测到。

$ ls -R | grep '\brar$'
afile-rar
afile.rar

这是因为字母数字以外的字符通常被视为边界字符,因此会跳过此方法。

答案4

做就是了 :

ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"

grep你根本不需要。

笔记:上面的方法有效......但它仍然得到至少 afile-rar我不明白为什么。我会把它留在这里,但我并不为此感到自豪。无论如何,正如其他人所说:

find . '*.rar'

相关内容