Linux - check if there is an empty line at the end of a file
注意:此问题的措辞不同,使用"with / out newline"而不是"with / out empty line"
我有两个文件,一个是空行而另一个没有:
文件:text_without_empty_line
1 2 3 4
| $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
1 2 3 4 5
| $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# |
是否有命令或函数来检查文件末尾是否有空行?
我已经找到了这个解决方案,但它对我不起作用。 (编辑:IGNORE:使用preg_match和PHP的解决方案也可以。)
-
您的第二个示例似乎包含2个换行符,因为它不仅将shell提示符包装到下一行,还包含空行。 这很重要还是无意?
-
哦,你是对的,我的控制台输出不正确,我改变它。 谢谢!
-
所以你真的在问,最后一行是空的。
-
@jww不重复,特别是在我编辑之后
只需输入:
如果有换行符,则以$符号结尾。
如果没有,它将以%符号结束。
-
我得到一个带有新行的$但是当没有行时似乎没有得到%。尝试BSD猫和GNU猫
在bash中:
1 2 3 4 5 6 7 8 9
| newline_at_eof()
{
if [ -z"$(tail -c 1"$1")" ]
then
echo"Newline at end of file!"
else
echo"No newline at end of file!"
fi
} |
作为可以调用的shell脚本(将其粘贴到文件中,chmod +x 使其可执行):
1 2 3 4 5 6 7 8 9
| #!/bin/bash
if [ -z"$(tail -c 1"$1")" ]
then
echo"Newline at end of file!"
exit 1
else
echo"No newline at end of file!"
exit 0
fi |
-
谢谢。你能提供整个脚本并描述如何使用它,我是一个新手来编写脚本。我没有得到任何输出。
-
确保您的解释器位于文件顶部的#!/bin/sh,然后只需添加该函数,然后在函数后添加newline_at_eof"$1"。或者只使用以下作为第2行并忘记函数test $(tail -c 1 $1) && printf"no newline at eof: $1
" || printf"newline at eof: $1
"
-
谢谢,现在脚本工作了。但我总是得到"Newline at file of end!"......即使是只包含一行的文件!
-
我编辑了我的答案,包括整个脚本。它应该适用于具有任意行数的文件(在Debian stretch amd64,bash 4.3-14 + b1,coreutils 8.23-4上测试)。
-
@EdwardBlack即使使用1行文件也应该总是得到newline at eof,因为POSIX指定所有files以换行符结尾(无论行数是多少)。注意:这并不意味着他们会。有很多编辑器编写非POSIX兼容的行结尾。
-
我已经读过这个,但在我的情况下,我的文件用于服务器配置,如果最后有空格,制表符或换行符,它将无法工作,所以我必须删除它们。
-
(exit之后的@Fred else是多余的。)
-
这不是他们所谓的重入(你离开然后回来完成if块?:)
-
我认为最好使用echo而不是exit,因为后者表明该过程是否有错误。
-
如果将退出状态与某个值进行比较比比较程序的输出(例如整数与字符串比较)更容易,则exit有时很有用。此外,这个答案很好地解释了退出代码没有真正的约定而不是0和2.例如,如果文件不同,diff返回1。这个过程几乎不是错误。
我在这里找到了解决方案。
1 2 3 4 5 6 7
| #!/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
用法:
1 2
| ./script text_with_newline OUTPUT: Newline at end of file!
./script text_without_newline OUTPUT: No Newline at end of file! |
-
这将检查最后两个字符是否为换行符。可能大多数人认为你要问的一个更加有趣的问题是如何识别在最终换行之后有文本的无效文本文件。
\Z元字符表示字符串的绝对结尾。
1 2 3 4
| if (preg_match('#
\Z#', file_get_contents('foo.txt'))) {
echo 'New line found at the end';
} |
所以在这里你要看一个字符串绝对末尾的新行。 file_get_contents最后不会添加任何内容。 但它会将整个文件加载到内存中; 如果你的文件不是太大,那没关系,否则你必须为你的问题带来一个新的解决方案。
-
谢谢。但我只是尝试了它,我总是得到"最后找到新行",即使没有新行。十二点试试吧。
-
我总是在提交之前尝试。它工作正常。也许这是你的文本编辑器在结尾自动结束一个新行,就像nano那样。
-
我应该使用哪个文本编辑器而不是nano?
-
vi例如。按i进入编辑模式,按esc退出编辑模式,按:qw退出程序保存更改。
-
我用vi创建了一个单行程,但我仍然得到"最后找到新行",你确定你的代码正常吗?
-
你复制了我的代码吗?因为我一次又一次地尝试它,它只是起作用。
-
在vi的屏幕底部,你应该看到"[不完整的最后一行]",这意味着最后没有新行。
-
我做了一个截图,不幸的是我不知道如何在评论部分上传图片,所以我上传到了pasteall:pasteall.org/pic/show.php?id = 98003没有[incomplete last line]
-
这太超级怪了。如果你做php -r 'echo nl2br(file_get_contents("/var/www/html/textohne_newline"));',你最后会看到"
"吗?
-
是的,如果我这样做,最后会有
,这很奇怪。你知道为什么要加这个吗?
-
也许检查一下:stackoverflow.com/questions/1050640/…
-
谢谢您的帮助!!
-
如果您的问题得到解答,请不要忘记标记正确的答案。