我文件的最后一行不应该将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怎么样??
答案 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