Linux - 检查文件末尾是否有空行

25

注意:这个问题以前的措辞不同,使用“带/不带换行符”而不是“带/不带空行”

我有两个文件,一个带有空行,一个没有:

文件:text_without_empty_line

$root@kali:/home#cat text_without_empty_line
This is a Testfile
This file does not contain an empty line at the end
$root@kali:/home#

文件:text_with_empty_line

$root@kali:/home#cat text_with_empty_line
This is a Testfile
This file does contain an empty line at the end

$root@kali:/home#

有没有命令或函数可以检查文件末尾是否有空行? 我已经找到了这个解决方案,但对我没用。(编辑:忽略:使用preg_match和PHP的解决方案也可以。)


1
你的第二个例子似乎在结尾处包含了两个换行符,因为它不仅将 shell 提示符换到了下一行,还包括了一个空行。这是有意为之还是无意的错误? - Daniel Böhmer
哦,你说得对,我的控制台输出有误,我已经更改了。谢谢! - Black
2
所以你的真正问题是,最后一行是否为空。 - tripleee
1
@jww 不是重复的,尤其是在我的编辑之后。 - törzsmókus
4个回答

32

只需输入:

cat -e nameofyourfile
如果有换行,则以$符号结束;如果没有,则以%符号结束。

我在使用BSD cat和GNU cat时,发现在有新行的情况下会得到$,但是在没有新行的情况下似乎无法得到% - leetbacoon

22

Olivier Pirson的回答比我最初在这里发布的更简洁(它也正确处理空文件)。 我编辑了我的解决方案以匹配他的。

在bash中:

newline_at_eof()
{
    if [[ -s "$1" && -z "$(tail -c 1 "$1")" ]]
    then
        echo "Newline at end of file!"
    else
        echo "No newline at end of file!"
    fi
}

作为一个可以调用的shell脚本(将其粘贴到一个文件中,chmod +x <filename>以使其可执行):

#!/bin/bash
if [[ -s "$1" && -z "$(tail -c 1 "$1")" ]]
then
    echo "Newline at end of file!"
else
    echo "No newline at end of file!"
fi

1
确保你的解释器在文件顶部是 #!/bin/sh,然后只需添加函数,然后在函数之后添加 newline_at_eof "$1"。或者只需使用以下内容作为第二行,忘记函数:test $(tail -c 1 $1) && printf "no newline at eof: $1\n" || printf "newline at eof: $1\n" - David C. Rankin
1
我编辑了我的答案,包括整个脚本。它应该适用于任意行数的文件(在Debian stretch amd64,bash 4.3-14+b1,coreutils 8.23-4上进行了测试)。 - Fred
1
@EdwardBlack,即使是只有一行的文件,你也应该始终获得newline at eof,因为POSIX规定所有文件都以换行符结尾(无论行数如何)。请注意:这并不意味着它们一定会这样做。有很多编辑器会写入不符合POSIX标准的行尾。 - David C. Rankin
1
(@Fred 在 exit 之后使用 else 是多余的。) - Biffen
1
空文件是一种特殊情况,必须单独检查。一种方法是通过以下方式完成: if [[ -s "$1" && -z "$(tail -c 1 "$1")" ]] - Olivier Pirson
显示剩余6条评论

3

我在这里找到了解决方案。

#!/bin/bash
x=`tail -n 1 "$1"`
if [ "$x" == "" ]; then
    echo "Newline at end of file!"
else
    echo "No Newline at end of file!"
fi

重要提示:确保您有执行和阅读脚本的权限!

chmod 555 script

用法:

./script text_with_newline        OUTPUT: Newline at end of file!
./script text_without_newline     OUTPUT: No Newline at end of file!

这个检查是否最后两个字符是换行符。一个更有趣的问题,可能大多数人认为你在问的是如何识别在最后一个换行符之后还有文本的无效文本文件。 - tripleee

2
\Z元字符表示字符串的绝对结尾。
if (preg_match('#\n\Z#', file_get_contents('foo.txt'))) {
    echo 'New line found at the end';
}

所以你现在看到的是一个字符串结束时的新行。 file_get_contents 不会在末尾添加任何内容。但它会将整个文件加载到内存中;如果你的文件不太大,那没问题,否则你需要采取新的解决方案。


谢谢。但我刚刚尝试了一下,即使没有换行符,我总是会得到“在结尾处找到新行”的提示。你也可以自己试试看。 - Black
我总是在提交之前进行尝试。它能正常工作。也许是你的文本编辑器自动在结尾处添加了一个新行,就像nano一样。 - JesusTheHun
1
按下 i 进入编辑模式,按下 esc 退出编辑模式,输入:qw 退出程序并保存更改。 - JesusTheHun
1
在vi的屏幕底部,你应该看到“[Incomplete last line]”,这意味着实际上在结尾处没有新行。 - JesusTheHun
1
这太奇怪了。如果你执行 php -r 'echo nl2br(file_get_contents("/var/www/html/textohne_newline"));',你会看到末尾有一个 "<br />" 吗? - JesusTheHun
显示剩余7条评论

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