我正在尝试做与这个问题相反的事情,用Windows行结尾替换Unix行结尾,这样我就可以使用SQL Server bcp而不是samba来导入文件。我安装了
sed
,但没有安装 dos2unix
。我尝试颠倒示例,但无济于事。
这是我正在使用的命令。
sed -e 's/\n/\r\n/g' myfile
我执行了这个,然后运行
od -c myfile
,期望在曾经有 \r\n
的地方看到 \n
。但一切仍然\n
。 (或者至少看起来是这样。od 的输出溢出了我的屏幕缓冲区,所以我看不到文件的开头)。
我一直无法弄清楚我做错了什么。有什么建议吗?
面对这个问题时,我使用一个简单的
perl
单行:
perl -pi -e 's/\n/\r\n/' filename
因为
sed
行为各不相同,而且我知道这是有效的。
dos2unix
安装到机器上有什么问题吗?sed
还是普通的非 GNU sed
?在 Solaris 上,
/usr/bin/sed
要求:
sed 's/$/^M/'
我通过输入 controlV controlM 输入“^M”。 '$' 匹配行尾,并用 control-M 替换行尾。您也可以编写脚本。
期望
sed
扩展 '\r
' 或 '\\r
' 来控制-M 的机制充其量将是特定于平台的。
您不需要
-e
选项。
$
匹配结束行字符。此 sed
命令将在行尾之前插入 \r
字符:
sed 's/$/\r/' myfile
仅在
\r
前面添加 ^M
(又名 \n
,请参阅 Jonathan Leffler 的答案)并不安全,因为该文件可能具有混合模式 EOL,因此您可能会面临某些行变为 \r\r\n
的风险。安全的做法是首先删除所有 '
' 字符,然后在 \r
之前插入(单个)\n
。
#!/bin/sh
sed 's/^M//g' ${1+"$@"} | sed 's/$/^M/'
更新为使用
^M
。
sed 's/\([^^M]\)$/\0^M/' your_file
这可确保您只插入 当没有 前 。这对我有用。
尝试使用:
echo " this is output" > input
sed 's/$/\r/g' input |od -c
这样做
sed 的/([^ ])$/ /'
效果非常好,之后我能够恢复独特的线条。我所有的重复项都消失了,因为其中一些有 /n,另一些有 /r/n
也许如果你尝试这样
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