perl -pe 'chomp if eof' filename >filename2

或者,编辑文件到位:

perl -pi -e 'chomp if eof' filename

[编者注: -pi -e本来就是-pie ,但正如几位评论者所指出的那样,由@hvd解释,后者不起作用。]

这在我看到的awk网站上被形容为“perl blasphemy”。

但是,在一个testing中,它的工作。

您可以利用shell 命令replace删除结尾换行符的事实:

在bash,ksh,zsh中工作的简单forms:

printf %s "$(< in.txt)" > out.txt

便携式(符合POSIX)替代scheme(效率稍低):

printf %s "$(cat in.txt)" > out.txt

注意:

如果in.txt以多个换行符结尾,则命令replace将删除所有这些 – 谢谢@Sparhawk。 (它不会删除尾随换行符以外的空格字符。)

由于此方法将整个input文件读入内存 ,因此build议使用较小的文件。

printf %s确保没有新行被添加到输出(这是符合POSIX标准的非标准echo -n ;请参阅http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html和https: //unix.stackexchange.com/a/65819 )

其他答案的指南 :

如果Perl是可用的,去接受的答案 – 它是简单的和高效的内存 (不会一次读取整个input文件)。

否则,考虑ghostdog74的awk答案 – 这是晦涩的,但也是内存效率 ; 一个更具可读性的等价物 (POSIX兼容)是:

awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt

由于将输出logging分隔符( OFS )设置为空string,因此打印被延迟一行,因此最后一行可以在END块中处理,在该块中打印时没有尾随\n 。

如果你想要一个详尽而又快速和健壮的解决scheme来真正地进行编辑 (而不是创build一个临时文件,然后replace原来的文件),请考虑jrockway的Perl脚本 。

你可以用GNU coreutils来做这个,它支持相对于文件末尾的参数。 所以要放弃最后一个字节的使用:

head -c -1

要testing一个结束的换行符,你可以使用tail和wc 。 以下示例将结果保存到临时文件,然后覆盖原始文件:

if [[ $(tail -c1 file | wc -l) == 1 ]]; then head -c -1 file > file.tmp mv file.tmp file fi

您还可以使用moreutils sponge进行“就地”编辑:

[[ $(tail -c1 file | wc -l) == 1 ]] && head -c -1 file | sponge file

你也可以在你的.bashrc文件中填充一个通用的可重用函数:

# Example: remove-last-newline < multiline.txt function remove-last-newline(){ local file=$(mktemp) cat > $file if [[ $(tail -c1 $file | wc -l) == 1 ]]; then head -c -1 $file > $file.tmp mv $file.tmp $file fi cat $file }

head -n -1 abc > newfile tail -n 1 abc | tr -d '\n' >> newfile

编辑2:

这是一个awk版本(更正) ,不积累潜在的巨大数组:

awk'{if(line)print line; line = $ 0} END {printf $ 0}'abc

呆子

awk '{q=p;p=$0}NR>1{print q}END{ORS = ""; print p}' file

如果你想做的正确,你需要这样的事情:

use autodie qw(open sysseek sysread truncate); my $file = shift; open my $fh, '+>>', $file; my $pos = tell $fh; sysseek $fh, $pos - 1, 0; sysread $fh, my $buf, 1 or die 'No data to read?'; if($buf eq "\n"){ truncate $fh, $pos - 1; }

我们打开文件进行阅读和追加; 追加意味着我们已经seek了文件的结尾。 然后我们用tell来得到文件末尾的数字位置。 我们用这个数字来找回一个字符,然后我们读取这个字符。 如果是换行符,我们将文件截断到换行符之前的字符,否则,我们什么也不做。

这在任何input的恒定时间和恒定的空间运行,并且不需要更多的磁盘空间。

这是一个不错的,整洁的Python解决scheme。 我没有试图在这里简洁。

这会在原地修改文件,而不是复制文件并从副本的最后一行剥离换行符。 如果文件很大,这将比select最佳答案的Perl解决scheme快得多。

如果最后两个字节是CR / LF,它将截断一个文件两个字节,如果最后一个字节是LF,则截断一个文件。 如果最后一个字节不是(CR)LF,它不会尝试修改文件。 它处理错误。 在Python 2.6中testing

把它放在一个名为“striplast”和chmod +x striplast 。

#!/usr/bin/python # strip newline from last line of a file import sys def trunc(filename, new_len): try: # open with mode "append" so we have permission to modify # cannot open with mode "write" because that clobbers the file! f = open(filename, "ab") f.truncate(new_len) f.close() except IOError: print "cannot write to file:", filename sys.exit(2) # get input argument if len(sys.argv) == 2: filename = sys.argv[1] else: filename = "--help" # wrong number of arguments so print help if filename == "--help" or filename == "-h" or filename == "/?": print "Usage: %s " % sys.argv[0] print "Strips a newline off the last line of a file." sys.exit(1) try: # must have mode "b" (binary) to allow f.seek() with negative offset f = open(filename, "rb") except IOError: print "file does not exist:", filename sys.exit(2) SEEK_EOF = 2 f.seek(-2, SEEK_EOF) # seek to two bytes before end of file end_pos = f.tell() line = f.read() f.close() if line.endswith("\r\n"): trunc(filename, end_pos) elif line.endswith("\n"): trunc(filename, end_pos + 1)

PS本着“Perl高尔夫”的精神,这里是我最短的Python解决scheme。 它将整个文件从标准input缓冲到内存中,并将所有换行清除,并将结果写入标准输出。 不像Perl那样简洁; 你只是不能打败Perl这样的小棘手快速的东西。

从调用.rstrip()删除“\ n”,它将从文件末尾剥离所有空白,包括多个空白行。

把它放到“slurp_and_chomp.py”中,然后运行python slurp_and_chomp.py < inputfile > outputfile 。

import sys sys.stdout.write(sys.stdin.read().rstrip("\n"))

还有另外一个WTDI:

perl -i -p0777we's/\n\z//' filename

$ perl -e'local $ /; $ _ = <>; S / \ n $ //; 打印'a-text-file.txt

另请参阅在sed中匹配任何字符(包括换行符) 。

一个非常简单的单行文件的方法,需要coreutils的GNU回显:

/bin/echo -n $(cat $file)

使用dd:

file='/path/to/file' [[ "$(tail -c 1 "${file}" | tr -dc '\n' | wc -c)" -eq 1 ]] && \ printf "" | dd of="${file}" seek=$(($(stat -f "%z" "${file}") - 1)) bs=1 count=1 #printf "" | dd of="${file}" seek=$(($(wc -c < "${file}") - 1)) bs=1 count=1

perl -pi -e 's/\n$// if(eof)' your_file

假设Unix文件types,你只想要最后一个换行符。

sed -e '${/^$/d}'

它不会在多个换行符上工作…

* 仅在最后一行是空白行时有效。

一个快速的解决scheme是使用gnu实用程序截断:

[ -z $(tail -c1 file) ] && truncate -s-1

如果文件有新的尾行,则testing结果为真。

删除速度非常快,真正到位,不需要新文件,search也从最后一个字节读取(tail -c1)。

还有另外一个回答FTR(和我最喜欢的!):echo / cat你想要通过反引号去除和捕获输出。 最后的换行符将被删除。 例如:

# Sadly, outputs newline, and we have to feed the newline to sed to be portable echo thingy | sed -e 's/thing/sill/' # No newline! Happy. out=`echo thingy | sed -e 's/thing/sill/'` printf %s "$out" # Similarly for files: file=`cat file_ending_in_newline` printf %s "$file" > file_no_newline

我唯一想做的就是代码高尔夫,然后我把代码从文件中拷贝出来并粘贴到echo -n 'content'>file语句中。

sed ':a;/^\n*$/{$d;N;};/\n$/ba' file

我有一个类似的问题,但正在与Windows文件,并需要保持这些CRLF – 我的解决scheme在Linux上:

sed 's/\r//g' orig | awk '{if (NR>1) printf("\r\n"); printf("%s",$0)}' > tweaked

sed -n "1 x;1 !H $ {x;s/\n*$//p;} " YourFile

应该删除文件中最后发生的\ n。 无法处理大文件(由于sed缓冲区限制)

ruby:

ruby -ne 'print $stdin.eof ? $_.strip : $_'

要么:

ruby -ane 'q=p;p=$_;puts q if $.>1;END{print p.strip!}'

POSIX SED:

'$ {/ ^ $ / d}'

$ - match last line { COMMANDS } - A group of commands may be enclosed between { and } characters. This is particularly useful when you want a group of commands to be triggered by a single address (or address-range) match.

linux删除最后一个换行符,如果它是文件中的最后一个字符,如何删除换行符?...相关推荐

  1. linux内核全局变量重定位,关于可重定位文件中全局变量的一个重定位疑惑,借各位牛刀一用^...

    /// 不需要牛刀,不需要阅读源码,如果只是为解决109的含义.楼主执行的查询命令readelf -S  test2.o [ 8] .symtab           SYMTAB           ...

  2. 多个文件中如何共用一个全局变量

    多个文件中如何共用一个全局变量 例子: 头文件:state.h   源文件:state.cpp 其它源文件:t1.cpp  t2.cpp  t3.cpp, 这些源文件都包含头文件state.h. 需要 ...

  3. cmd执行bat结果不回显_cmd - 如何在bat文件中调用另一个bat文件

    情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调用b.bat,如下. a.bat @echo off echo I am a.ba ...

  4. C++ 在一个cpp文件中使用另一个cpp文件中定义的函数

    C++ 在一个cpp文件中 使用另一个cpp文件中定义的函数 建立一个console项目 头文件 cpp文件 main.cpp 建立一个console项目 以dev为例,在[文件][新建][项目],新 ...

  5. cmd 如何在bat文件中调用另一个bat文件

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调 ...

  6. python 在一个py文件中调用另一个py文件中的变量以及一个有趣的问题

    python 在一个py文件中调用另一个py文件中的变量以及一个有趣的问题 1.在一个py文件中调用另一个py文件中的变量 新建一个py文件,记为t1.py # t1.py m = 2 n = 1 a ...

  7. linux在所有文件中查找某一个字符

    转载自 https://www.cnblogs.com/wangkongming/p/3852328.html # find <directory> -type f -name " ...

  8. linux spool输出一行 不换行,clob内容spool到文件中后,怎么去掉自动换行

    将一个存储过程导出到处到文件中,发现有些注释因为换行,导致无法执行.怎么才可以去掉换行,通过set long,set wrap 都不管用. 存储过程脚本 CREATE OR REPLACE PROCE ...

  9. android 侧滑删除功能,200行代码让你在Android中完美实现iOS版侧滑删除效果

    使用几个月的IOS之后,发现IOS中侧滑删除俺就 大家好,自己开始学习Android已经差不多半年了吧,前前后后看了不少的博客获益匪浅.渐渐的随着技术的提升,慢慢感觉网上其它的一些功能的实现又不是那么 ...

最新文章

  1. linux 启动流详解
  2. vscode 语法检查_Jenkins 声明式流水线的语法错误检查
  3. ASP.NET(第七章数据插入与更新:DataList)-asp.net关注
  4. F - Wormholes(判断是否存在负环)
  5. linux 看日期,Linux查看日期和时间
  6. 三维建模软件:Rhino 7 for Mac
  7. git学习笔记(三)
  8. vi单文件操作常用命令
  9. SMC 如何下载三维及二维图
  10. 个税服务器系统繁忙,2021个人所得税系统异常进不去怎么办?系统繁忙请稍后再试怎么回事...
  11. [CAN BUS] USB-CAN adpter / USB转CAN 开源项目推荐(CANable candlelight cangaroo)
  12. 为啥俺要写博客--凭什么?
  13. 163邮箱邮件服务器域名,注册申请网易免费域名邮箱服务
  14. unity-shader-头发渲染-各向异性
  15. 利用Google博客搜索查看加密QQ空间(qzone)日志
  16. jsp复习题库(1)
  17. 同步时序逻辑电路分析——数电第六章学习
  18. 给懒懒的Git操作手册
  19. mysql表分区数量限制_详解MySQL分区表的局限和限制的代码实例
  20. android接入原生第三方登录(微信登录、QQ登录、新浪微博登录)

热门文章

  1. Linux下搭建云服务器(三) —— Mysql安装
  2. 运用C#在VS2017的PictureBox控件中绘制简易二自由度机械臂,并且让机械臂实现画直线、圆、人物轮廓及写字的功能。
  3. 『号外』Dynamo案例百解累积更新(2021.04)介绍~
  4. 2022-2028年全球与中国医疗区块链应用行业发展趋势及竞争策略研究
  5. 战地一服务器性能,《战地1》PC版画面性能测试 CPU要求极高显卡可以放心
  6. >算法笔记-动态规划-最短路径迪杰斯特拉算法
  7. kettle开发篇-JavaScript脚本-Day31
  8. java List转字符串
  9. Win7全球份额首超XP 成使用最广泛系统
  10. 上古卷轴3晨风职业_《上古卷轴》全系列回顾及剧情简介