如何在每个换行符前添加回车符?


28

我有一个仅用于\n换行的文件,但我需要\r\n每个换行都有它。我怎样才能做到这一点?

例如,我在Vim中使用来解决了这个问题:%s/\n/\r\n/g,但是我想使用脚本或命令行应用程序。有什么建议么?

我尝试使用sed或进行查找grep,但是我立即对转义序列变通方法感到困惑(这些命令对我有点绿色)。

如果有兴趣,该申请涉及到我的问题/答案在这里

Answers:


36

您可以使用unix2dos(在Debian上找到):

unix2dos file

请注意,此实现不会CR在所有LF之前插入LF,而不会在之前添加一个(也只有一个),CR并且会跳过二进制文件(那些文件的字节值在0x0-> 0x1f范围内,,除外LF)之前FFTABCR)。

或使用sed

CR=$(printf '\r')
sed "s/\$/$CR/" file

或使用awk

awk '{printf "%s\r\n", $0}' file

或使用perl

perl -pe 's|\n|\r\n|' file

请注意,unix2dox不会CR每个 LF 之前插入一个,而只会在那些尚未带有一个(也只有一个)CR的LF 之前插入一个。
斯特凡Chazelas

@StéphaneChazelas:谢谢你的意思,将其添加到我的答案中。
cuonglm

1
的信息对我来说,关键棋子这里用'\r'sed的伎俩。
rkersh

8

这正是这样unix2dos做的:

$ unix2dos file.txt

那将取代 file.txt为带有CRLF行尾的版本。

如果要使用进行操作,则sed可以在每行末尾插入一个回车符:

sed -e 's/$/\r/' file.txt

这将替换(s)的线(结束前的大小为零的区域向右$)用\r。要进行就地替换(与之类似unix2dos),请使用sed -i.bak,尽管这是非标准扩展名-如果没有扩展名,请使用一个临时文件。


3
使用\r替代是不可移植。至少,它在Mac OSX中不起作用。
cuonglm

请注意,有几种unix2dos实现。你可能想给一个链接到一个特定的实现的主页(如waterlan.home.xs4all.nl/dos2unix.html在Debian为找到),而不是linux.die.net/man不说清楚这实现(或版本)已记录在案。需要注意的是有一些u2dux2dostodos命令各地也是如此。
斯特凡Chazelas

2

如果要在Unix机器(OS X,Linux)上进行转换,请使用vi或打开文件vim

$ vim my-file

按ESC键以确保您未处于插入模式,然后键入

:set ff=dos

要么

:set fileformat=dos

这通过设置文件格式进行适当的转换。

要编写文件并退出编辑器,请使用

:wq

在命令行上,您可以执行

$ vi +':w ++ff=dos' +':q' my-file

感谢您解释所有步骤-对于新手来说,它使您更容易了解正在发生的事情。
user3616725 '17

2

使用POSIX这样做很棘手:

  • POSIX Sed不支持\r\15。即使这样做,就位选项-i也不是POSIX

  • POSIX Awk支持\r\15,但是该-i inplace选项不是POSIX

  • d2udos2unix不是POSIX实用程序,但ex

  • POSIX前不支持\r\15\n或者\12

要删除回车,请执行以下操作:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

要添加回车符:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file

1

可移植的shell函数将执行以下操作:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

这样,您可以执行以下操作:

u2dos file >dosfile

1

在awk中,您可以尝试

awk '{print $0 "\r"}'

要么

awk -v r=$'\r' '{print $0 r}'

$'\r'是ANSI-C风格的报价由像一些炮弹作为支持的例子ksh93bashzshmksh和FreeBSD sh 以及可能被包含在统一UNIX规范的问题8

它提供了一种表达怪异字符的通用方法,请尝试以下操作,例如:

awk -v r=$'\U0001F608' '{print $0 r}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.