使用grep检测行尾的模式

Sop*_*rez 89 grep

如果我做:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part
Run Code Online (Sandbox Code Playgroud)

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

我试过(考虑EOL):

ls -R | grep ".rar\n"
Run Code Online (Sandbox Code Playgroud)

没有结果。
我想,如果greping发现问题出在发现在该行的末尾,但我不知道。

请问这里有什么帮助吗?

jor*_*anm 119

所述$锚的线的端部相匹配。

ls -R | grep '\.rar$'
Run Code Online (Sandbox Code Playgroud)

您也可以find为此使用:

find . -name '*.rar'
Run Code Online (Sandbox Code Playgroud)

  • 我没有意识到“。” 需要在 grep 中转义。它被视为通配符吗? (2认同)
  • @thebunnyrules“。” 在正则表达式中表示任何字符之一。 (2认同)
  • 这对我在 macOS 上使用 zsh 不起作用。当我添加 $ 时,我没有得到任何匹配项,当我看到没有 $ 时,我应该得到一个匹配项。^ 适用于行首,但 $ 不适用于 EOL (2认同)
  • @jordanm 抱歉,问题在于 grep 而不是 ls。我正在做“cat list_of_words.txt | grep '^lunar$'” 如果没有$,我会得到5个单词的列表:lunar、lunaria、lunarian、lunarians、lunars ..如果我添加$,那么我预计会得到“月球”但我什么也没得到。使用 \b 代替 $ 可以。 (2认同)

Hau*_*ing 11

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

ls -R | grep "\.rar$"
Run Code Online (Sandbox Code Playgroud)

  • @SopalajodeArrierez 不,它不匹配每组字符,而是匹配每个字符,例如`xrar`。 (2认同)

slm*_*slm 5

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

$ ls -R | grep '\brar$'
Run Code Online (Sandbox Code Playgroud)

例子

假设我有这个示例数据。

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part
Run Code Online (Sandbox Code Playgroud)

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

$ ls -R | grep '\brar$'
afile.rar
Run Code Online (Sandbox Code Playgroud)

这是如何工作的?

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

这不起作用的情况

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

$ ls -R | grep '\brar$'
afile-rar
afile.rar
Run Code Online (Sandbox Code Playgroud)

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

  • @SopalajodeArrierez - 无论哪种方式都不起作用。这将找到任何可能以“.rar”开头的文件。但使用“ls -R”这些都不会成为问题。仅当您碰巧使用“ls -Ra”时。 (2认同)
  • @SopalajodeArrierez - 如果文件包含换行符(`\n`),这是一个合法的字符。无论如何,“ls -1R”将强制文件显示在单列中。 (2认同)