将\ n替换为Unix文件中的\ r \ n

时间:2009-10-05 18:30:55

标签: unix cross-platform sed

我正在尝试与this question相反,用Windows行结尾替换Unix行结尾,这样我就可以use SQL Server bcp over samba to import the file。我安装了sed但未dos2unix。我试图扭转这些例子,但无济于事。

这是我正在使用的命令。

sed -e 's/\n/\r\n/g' myfile

我已执行此操作,然后运行od -c myfile,希望看到曾\r\n的{​​{1}}。但仍有\n。 (或者至少他们看起来是。od的输出溢出了我的屏幕缓冲区,所以我不会看到文件的开头)。

我无法弄清楚我做错了什么。有什么建议吗?

7 个答案:

答案 0 :(得分:16)

当面对这种情况时,我会使用一个简单的perl单行:

perl -pi -e 's/\n/\r\n/' filename

因为sed行为有所不同,我知道这有效。

答案 1 :(得分:11)

  • dos2unix放到机器上有什么问题?
  • 您正在使用的平台是什么?
  • 您是否拥有GNU sed或常规非GNU sed

在Solaris上,/usr/bin/sed需要:

sed 's/$/^M/'

我通过键入 control V control M 输入'^ M'。 '$'匹配在行尾,并用control-M替换行尾。你也可以编写脚本。

期望sed将“\r”或“\\r”扩展为control-M的机制最多只是针对特定于平台的。

答案 2 :(得分:3)

您不需要-e选项。

$与结束字符匹配。此sed命令将在行尾之前插入\r个字符:

sed 's/$/\r/' myfile 

答案 3 :(得分:1)

\r前添加^M(又名\n,请参阅Jonathan Leffler的答案)是不安全的,因为该文件可能具有混合模式EOL,因此您冒险结束有些线路正在考虑\r\r\n。安全的做法是首先删除所有'\ r'字符,然后在\r之前插入(单个)\n

#!/bin/sh
sed 's/^M//g' ${1+"$@"} | sed 's/$/^M/'

已更新以使用^M

答案 4 :(得分:1)

 sed 's/\([^^M]\)$/\0^M/' your_file

这确保只有在\ n之前没有\ r时才插入\ r \ n。这对我有用。

答案 5 :(得分:0)

尝试使用:

echo " this is output" > input
sed 's/$/\r/g' input |od -c

答案 6 :(得分:-1)

也许如果你这样尝试

cat myfile | sed 's/\n/\r\n/g' > myfile.win

将起作用,从我的理解你只需要替换为控制台输出,你需要将输出重定向到一个文件,在这种情况下是myfile.win,然后你可以将它重命名为你想要的任何东西。整个脚本将(在一个充满这种文件的目录中运行):

#!/bin/bash
for file in $(find . -type f -name '*')
do
  cat $file | sed 's/\n/\r\n/g' > $file.new
  mv -f $file.new $file
done