如何找到不以换行符/换行符结尾的文件?

Lan*_*nes 25 linux bash perl

如何列出.txt不以换行符结尾的普通text()文件名?

例如:list(输出)这个文件名:

$ cat a.txt
asdfasdlsad4randomcharsf
asdfasdfaasdf43randomcharssdf
$ 
Run Code Online (Sandbox Code Playgroud)

并且不列出(输出)此文件名:

$ cat b.txt
asdfasdlsad4randomcharsf
asdfasdfaasdf43randomcharssdf

$
Run Code Online (Sandbox Code Playgroud)

小智 25

使用pcregrep,一个perp兼容的正则表达式版本的grep,它支持使用-M标志的多行模式,如果最后一行有换行符,可用于匹配(或不匹配):

pcregrep -LMr '\n$' .
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们要-r在当前目录(.)中列出recursively()列出不匹配的文件(-L)我们的multiline(-M)正则表达式,它在文件末尾查找换行符('\n$')

更改-L-l会列出该文件具有换行符在其中.

pcregrep可以使用自制pcre程序包安装在MacOS上:brew install pcre

  • 我在答案中添加了一组缺失的引号,应该可以解决该问题。 (2认同)
  • 只是给未来读者的一个提示:这个 pcregrep 命令对于*不*包含空行的文件是正确的。反例:`printf "a\n\nb" | pcregrep -M '\n$' -` 将打印 `a`(因此使用 `-L` 运行将不打印任何内容)。 (2认同)
  • 使用`\ Z`而不是`$`(即`pcregrep -LMr'\n\Z'.`)来避免@maverickwoo提到的问题. (2认同)

Jul*_*ard 20

好的,轮到我了,我试一试:

find -type f -print0 | xargs -0 -L1 bash -c 'test "$(tail -c 1 "$0")" && echo "No new line at end of $0"'
Run Code Online (Sandbox Code Playgroud)

  • BSD find 与 macOS 中的一样,需要指定路径。 (8认同)
  • @JulienPalard 该路径在当前(IEEE Std 1003.1-2017)Posix 标准中不是可选的,因此它并没有真正落后。不提供路径可能意味着_使用当前目录_或_使用我的主目录_或_使用根_或不同平台上的任何内容。在未给出路径时给出错误是完全合规的。 (4认同)

Pau*_*ce. 9

尝试一下:

find -type f -exec sh -c '[ -z "$(sed -n "\$p" "$1")" ]' _ {} \; -print
Run Code Online (Sandbox Code Playgroud)

它将打印以空行结尾的文件的文件名.要打印不以空行结尾的文件,请更改-z-n.

  • 优秀的解决方案。建议您不要在`sh`脚本中回显,而是在find命令的末尾添加`-print`。然后可以将“ -print”修改为所需的任何内容(例如,“-print0”)。 (2认同)

小智 6

如果您使用“ack”(http://beyondgrep.com)作为 grep 的替代品,您只需运行以下命令:

ack -v '\n$'
Run Code Online (Sandbox Code Playgroud)

它实际上搜索与行尾的换行符 (-v) 不匹配的所有行。


Tom*_*son 6

如果您安装了 ripgrep:

rg -l '[^\n]\z'
Run Code Online (Sandbox Code Playgroud)

该正则表达式匹配任何不是换行符的字符,然后匹配文件的结尾


yst*_*sth 2

这很糟糕;有人肯定可以做得更好:

for f in `find . -name '*.txt' -type f`; do
    if test `tail -c 1 "$f" | od -c | head -n 1 | tail -c 3` != \\n; then
        echo $f;
    fi
done
Run Code Online (Sandbox Code Playgroud)

注意,这回答了标题中的问题,这与正文中的问题不同(我认为它正在寻找以 \n\n 结尾的文件)。