如何列出.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
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)
尝试一下:
find -type f -exec sh -c '[ -z "$(sed -n "\$p" "$1")" ]' _ {} \; -print
Run Code Online (Sandbox Code Playgroud)
它将打印以空行结尾的文件的文件名.要打印不以空行结尾的文件,请更改-z为-n.
小智 6
如果您使用“ack”(http://beyondgrep.com)作为 grep 的替代品,您只需运行以下命令:
ack -v '\n$'
Run Code Online (Sandbox Code Playgroud)
它实际上搜索与行尾的换行符 (-v) 不匹配的所有行。
如果您安装了 ripgrep:
rg -l '[^\n]\z'
Run Code Online (Sandbox Code Playgroud)
该正则表达式匹配任何不是换行符的字符,然后匹配文件的结尾。
这很糟糕;有人肯定可以做得更好:
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 结尾的文件)。
| 归档时间: |
|
| 查看次数: |
9929 次 |
| 最近记录: |