我正在尝试与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的输出溢出了我的屏幕缓冲区,所以我不会看到文件的开头)。
我无法弄清楚我做错了什么。有什么建议吗?
答案 0 :(得分:16)
当面对这种情况时,我会使用一个简单的perl
单行:
perl -pi -e 's/\n/\r\n/' filename
因为sed
行为有所不同,我知道这有效。
答案 1 :(得分:11)
dos2unix
放到机器上有什么问题?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