Bash:查找行末尾带有空格的文件

27

我正在寻找一条bash命令来查找每行末尾带有空格的文件。我不想删除这些空格,只是想找到这些文件。


4
注意:虽然问题的措辞(截至本回答撰写时)明确要求在每一行中查找带有尾随空格的文件,但是这一要求的非常规性导致一些答案——特别是获得最多赞的答案——只查找带有一个或多个带有尾随空格的行的文件。 - mklement0
sed -n '/ +$/p' 文件名 - Luv33preet
8个回答

45

查找具有尾随空格的文件。

find . -type f -exec egrep -l " +$" {} \;

虽然其他答案已经证明了只使用grep也可以应付,但如果您想更好地控制要检查的文件,使用find仍然是一个不错的选择。您可以通过使用+而不是\;来终止-exec主命令,从而使find命令更加高效 - 这将只调用一次egrep(通常),并使用所有文件名。 - mklement0
1
请注意,此答案查找具有至少1行带有尾随空格的文件。这肯定很有用,可能是更常见的用例,但不是OP所要求的(至少暗示了他们的措辞,“在每行的末尾”)。 - mklement0

26

如果目标是列出具有一个或多个行尾空格的文件:

grep -r '[[:blank:]]$' .

如果不打印行,只打印文件名,还需指定-l选项。这里的l代表单词list,而不是数字1


1
问题说的是“在每行末尾”。 - Sorin
1
@Sorin 我猜这可能不是原帖的真正意图,但要承认问题确实字面上是这样说的... - twalberg
@twalberg,这就是使它成为一个非平凡问题的原因,这将值得第三个几乎相同的答案。 - Sorin
@Sorin 如果是这样的话,也许 grep -rL '[^[:blank]]$' 可以解决问题... 它会搜索那些包含一行末尾不是空格的文件,并报告所有不符合该模式的文件... - twalberg
2
如果字面上理解OP的问题,我不知道它在现实世界中有任何实际应用。在我看来,它应该被编辑以反映常见用例和最受欢迎的答案。毕竟,这个问题也是“grep trailing whitespace”的谷歌搜索结果中排名最高的。对于这样编辑问题是否有任何异议? - Asclepius
显示剩余2条评论

5

查找带有一个或多个尾随空格字符的文件:

find . -name "*" | xargs egrep ".* +$"

我认为最初的问题是要找到所有行末有空格的文件。不过可能最初的措辞不太准确。 - Etheryte
@Nit,在正文中确实清楚地说明了,可能错过了,但问题标题可能会有歧义。 - matcheek
进一步扩展您的解决方案,egrep -m1 -v -l ".* +$" 应该能够找到所有每行末尾没有空格的文件,如果我没理解错的话? - Etheryte
如果前者总是成立,那么 LIST=find * | xargs egrep -m1 -v -l ".* +$" | xargs -I {} echo {};echo -e "$LIST""\n""find *" 应该列出所有不符合两次标准的文件以及我们想要列出一次的文件。然而,似乎我在某个地方破坏了管道,所以无法对结果使用 uniq。有什么想法吗? - Etheryte
6
更简单的正则表达式:' $',或者包括制表符和空格的正则表达式:'[[:blank:]]$' - Dennis Williamson
2
引起各种警告 egrep: (path): Is a directory。确保指定 -type f 以仅将文件名传递给 grep。 - Timo Tijhof

3

如果目标是在当前路径中列出带有末尾空格文件列表:

grep -rli '[[:blank:]]$' .

2

有一种选项可以列出不包含任何匹配的文件; 使用该选项和一个正则表达式,用于匹配行末之前的非空格字符。

grep -L '[^ ]$' *

要递归目录,请添加-r。如果还要搜索其他空白字符,可以使用字符类$'[^ \t]$'或正则表达式的POSIX'[^[:blank:]]$'


干得好。这确实只返回所有行都有尾随空格的文件 - 有一个例外:_empty_(零字节)文件也会被匹配。此外,如果使用*(不带-r),则会针对任何子目录发出警告。 -L不符合POSIX标准,但广泛支持,因为GNU grep和BSD sed都实现了它。 - mklement0
1
@mklement0 对于零大小文件的发现很好。您可以使用“-s”来抑制有关目录的警告,或者如果要遍历整个目录树(OP未指定任务),则可以使用“-r .”。 - tripleee

1
使用 ack(或 ag):
ack -l ' \n'

注意:和其他答案一样,这将列出包含一个或多个带有尾随空格的行的文件。

0
如果问题是要查找每一行末尾都有空格的文件,那么这应该可以解决:
grep -rL '[^[:blank:]]$' .

-L 告诉 grep 报告每个不匹配模式的文件,而该模式正在查找在换行符之前没有空格的行。


-3

试一试这个:

find . -type f -name "* "

这将查找文件名末尾带有空格的文件。 - Kuzeko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接