从文件的最后一行删除LF

时间:2012-03-15 12:57:31

标签: scala vim haskell sed awk

我文件的最后一行不应该将LF作为最后一个字符。

在vim我能做到

:set noendofline binary
:wq

请参阅http://vim.wikia.com/wiki/File_format#Terminator_after_last_line

如何使用sed oneliner过滤器来处理更长的管道?

任何其他工具(无头vim?awk)对我都没问题。没有perl pls。

scala或haskell怎么样??

6 个答案:

答案 0 :(得分:3)

您可以使用head获取除最后一个之外的所有字节:

head -c $(($(stat -c %s file.txt)-1)) file.txt

python

python -c 'import sys; sys.stdout.write(sys.stdin.read()[:-1])' <file.txt

答案 1 :(得分:3)

如果您想丢失所有换行符,请执行以下操作:

awk '{printf "%s", $0}'

您还可以使用tr -d '\012'删除LF(NL)字符;这项工作可能比awk更快。

使用更精细的awk脚本,您可以保留除最后一行之外的所有换行符,如果您想要的话:

awk '{if (NR>1) print old; old=$0;} END { printf "%s", old }'

(你不能那个tr!)这两个awk脚本都可以插入管道。我不知道awk是否会处理单行&#39;单行&#39;文件,但它可能会处理它们。请记住,许多Unix工具都是以线条为基础的 - 要小心推动它们,并在投入生产之前仔细测试。

答案 2 :(得分:1)

这并不像看起来那么简单。您可以使用此awk(1)过滤器:

awk ' { if(l) { print line; } line=$0; l=1; } END { if(l) printf("%s", line); }'

简而言之:它逐行阅读。如果已经读取了一行(= l为真),则会打印它并记住下一行。最后,最后一行打印时没有换行。

您可以使用sed(1)实现相同的效果,您可以将输入视为单行,但我找不到这样做的选项。

答案 3 :(得分:1)

由于您特别要求Haskell版本,因此这里使用ByteString s,在stdin和stdout上运行:

import Data.ByteString as B
import Data.ByteString.Internal (c2w)
import Data.Word

main :: IO ()
main = B.interact removeLastLF

lf :: Word8
lf = c2w '\n'

removeLastLF :: ByteString -> ByteString
removeLastLF xs | B.last xs == lf = B.init xs
                | otherwise       = xs

答案 4 :(得分:1)

我认为这将在Haskell中发挥作用:

import Data.List (intercalate)
main = interact (intercalate "\n" . lines)

答案 5 :(得分:-1)

你可以简单地通过tr:

cat filename | tr -d "\n" > filename.nonl