在Unix中从文件中删除所有回车\r的最简单方法是什么?
当前回答
使用sed
sed $'s/\r//' infile > outfile
在Git Bash for Windows上使用sed
sed '' infile > outfile
第一个版本使用ANSI-C引用,如果命令从脚本运行,可能需要转义\。第二个版本利用了这样一个事实,即sed通过删除\r和\n字符逐行读取输入文件。但是,当向输出文件写入行时,它只追加一个\n字符。通过简单地修改IFS,可以设计出更通用的跨平台解决方案
IFS=$'\r\n' # or IFS+=$'\r' if the lines do not contain whitespace
printf "%s\n" $(cat infile) > outfile
IFS=$' \t\n' # not necessary if IFS+=$'\r' is used
警告:此解决方案执行文件名扩展(*,?,[…]如果设置了extglob,则更多)。只有在确定文件不包含特殊字符或需要展开时才使用它。 警告:没有一个解决方案可以处理输入文件中的\。
其他回答
Sed -i s/\r// <文件名>或someesuch;请参阅man sed或web上有关sed使用的丰富信息。
有一点需要指出的是上面“马车返回”的确切含义;如果您真正指的是单个控制字符“回车”,那么上面的模式是正确的。如果您指的是更一般的CRLF(回车和换行,这是Windows下换行的实现方式),那么您可能希望替换\r\n。Linux/Unix中的换行符(换行符)是\n。
有人推荐dos2unix,我也强烈推荐。我只是提供更多的细节。
如果已安装,请跳转到下一步。如果还没有安装,我建议通过yum安装:
yum install dos2unix
然后你可以这样使用它:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
我将假设您是指行尾的回车符(CR,“\r”,0x0d),而不是盲目地在文件中(据我所知,您可能将它们放在字符串中间)。使用这个测试文件,只在第一行的末尾加上CR:
$ cat infile
hello
goodbye
$ cat infile | od -c
0000000 h e l l o \r \n g o o d b y e \n
0000017
如果在您的系统上安装了Dos2unix,那么它是正确的选择:
$ cat infile | dos2unix -U | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
如果由于某种原因dos2unix对您不可用,那么sed将执行此操作:
$ cat infile | sed 's/\r$//' | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
如果由于某些原因sed对你不可用,那么ed会以一种复杂的方式来做:
$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
如果你没有在你的盒子上安装任何这些工具,你有比试图转换文件更大的问题:-)
在我看来,Linux上最简单的方法是,
sed -i.bak 's/\r$//g' <filename>
-i将编辑文件,而.bak将创建原始文件的备份,复制您的文件并在末尾添加扩展名.bak。(你可以在-i后面指定任何你想要的,或者只指定-i来不创建备份。)
替换操作符's/\r//'周围的强引号是必不可少的。如果没有它们,shell将把\r解释为转义+r,并将其简化为纯r,并删除所有小写r。这就是为什么Rob在2009年给出的答案不起作用。
添加/g修饰符可以确保即使是多个\r也会被删除,而不仅仅是第一个\r。
如果你使用的操作系统(如OS X)没有dos2unix命令,但有Python解释器(2.5+版本),这个命令相当于dos2unix命令:
python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"
它处理命令行上的命名文件以及管道和重定向,就像dos2unix一样。如果您将这一行添加到~/。Bashrc文件(或其他shell的等效配置文件):
alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""
... 下次登录时(或运行source ~/.)您将能够在命令行上以与其他示例相同的方式使用dos2unix名称。
推荐文章
- 如何从命令行通过mysql运行一个查询?
- 在创建守护进程时执行双fork的原因是什么?
- 对以制表符分隔的文件进行排序
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 在Bash中获取日期(比当前时间早一天)
- Linux: kill后台任务
- 在OSX中永久设置PATH环境变量
- 如何在C程序中获取当前目录?
- 如何在Bash中逐行合并两个文件
- 如何从远程SSH会话发送数据到本地剪贴板
- 我如何得到bash完成工作与别名?
- SSH端口转发~/。ssh /配置文件?
- 查找和替换-添加回车符或换行符
- 如何将多个文件的内容追加到一个文件