更换 和 在 Unix 文件中

问题描述 投票:0回答:8

我正在尝试做与这个问题相反的事情,用Windows行结尾替换Unix行结尾,这样我就可以使用SQL Server bcp而不是samba来导入文件。我安装了

sed
,但没有安装
dos2unix
。我尝试颠倒示例,但无济于事。

这是我正在使用的命令。

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

我执行了这个,然后运行

od -c myfile
,期望在曾经有
\r\n
的地方看到
\n
。但一切仍然
\n
。 (或者至少看起来是这样。od 的输出溢出了我的屏幕缓冲区,所以我看不到文件的开头)。

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

unix cross-platform sed
8个回答
18
投票

面对这个问题时,我使用一个简单的

perl
单行:

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

因为

sed
行为各不相同,而且我知道这是有效的。


14
投票
  • dos2unix
    安装到机器上有什么问题吗?
  • 您使用的平台是什么?
  • 您有 GNU
    sed
    还是普通的非 GNU
    sed

在 Solaris 上,

/usr/bin/sed
要求:

sed 's/$/^M/'

我通过输入 controlV controlM 输入“^M”。 '$' 匹配行尾,并用 control-M 替换行尾。您也可以编写脚本。

期望

sed
扩展 '
\r
' 或 '
\\r
' 来控制-M 的机制充其量将是特定于平台的。


5
投票

您不需要

-e
选项。

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

sed 's/$/\r/' myfile 

1
投票

仅在

\r
前面添加
^M
(又名
\n
,请参阅 Jonathan Leffler 的答案)并不安全,因为该文件可能具有混合模式 EOL,因此您可能会面临某些行变为
\r\r\n
的风险。安全的做法是首先删除所有 ' ' 字符,然后在
\r
之前插入(单个)
\n

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

更新为使用

^M


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

这可确保您只插入 当没有 前 。这对我有用。


0
投票

尝试使用:

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

0
投票

这样做

sed 的/([^ ])$/ /'

效果非常好,之后我能够恢复独特的线条。我所有的重复项都消失了,因为其中一些有 /n,另一些有 /r/n


-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 
© www.soinside.com 2019 - 2024. All rights reserved.