Macos 从CSV中删除\r(CR)
在OSX上,我需要从CSV文件中删除行尾CR(Macos 从CSV中删除\r(CR),macos,csv,sed,newline,Macos,Csv,Sed,Newline,在OSX上,我需要从CSV文件中删除行尾CR(\r)字符(在cat-v的输出中表示为^M): $ cat -v myitems.csv 输出: strPicture,strEmail^M image1xl.jpg,me@example.com^M 我用sed和perl尝试了很多选项,但都不管用 有什么想法吗?试试unix2dos命令 示例:unix2dos内嵌输出文件 wikipedia页面也有一些使用perl和sed的示例 perl -i -p -e 's/\n/\r\n/' file
\r
)字符(在cat-v
的输出中表示为^M
):
$ cat -v myitems.csv
输出:
strPicture,strEmail^M
image1xl.jpg,me@example.com^M
我用sed和perl尝试了很多选项,但都不管用
有什么想法吗?试试unix2dos命令 示例:unix2dos内嵌输出文件 wikipedia页面也有一些使用perl和sed的示例
perl -i -p -e 's/\n/\r\n/' file
sed -i -e 's/$/\r/' file
试试这个,它会解决你的问题
dos2unix myitems.csv myitems.csv
带有库存实用程序的解决方案: 注意:除了注明的地方(sed-i不兼容),以下解决方案在OSX(macOS)和Linux上都可以使用 使用
sed
如下,它将\r\n
替换为\n
:
sed$'s/\r$/'myitems.csv
要就地更新输入文件,请使用
sed-i'$'s/\r$/'myitems.csv
-i'
指定就地更新,其中'
指示不应对输入文件进行备份;如果指定扩展名,例如,-i'.bak'
,则原始输入文件将与该扩展名一起保存为备份。注意事项:
*使用GNU
sed
(Linux),为了不创建备份文件,您必须使用just-i
,没有单独的'
参数,这是GNU-sed和OSX(macOS)上使用的BSD-sed之间不幸的语法不兼容-请参阅我的完整内容。*
-i
使用临时名称创建新文件,然后替换原始文件;最显著的结果是,如果原始文件是符号链接,则将其替换为常规文件;有关详细讨论,请参阅的下半部分
注意:上面使用($”…
)在sed
命令中创建\r
字符,因为BSDsed
(在OS X上使用的一个)本机无法识别此类转义序列(请注意,在Linux发行版上使用的GNUsed
)
Bash、Ksh和Zsh支持ANSI C引号字符串
如果不想依赖这些字符串,请使用:
sed's/'“$(printf'\r')”$/'
这里,\r
通过printf
创建,并通过命令替换($(…)
)拼接到sed
命令中
使用
perl
:
perl-pe的/\r\n/\n/'myitems.csv | cat-v
要就地更新输入文件,请使用
perl-i-ple's/\r\n/\n/'myitems.csv#-i'.bak'首先创建后缀为'.bak'的备份
关于就地更新,与上述sed的警告相同
使用
awk
:
awk'{sub(“\r$”,”);print}'myitems.csv#更短:awk'sub(“\r$”,”)+1'
BSDawk
不提供就地更新选项,因此您必须在不同的文件中捕获输出;要使用临时文件并在以后替换原始文件,请使用以下习惯用法:
awk'{sub(“\r$”,“”);print}'myitems.csv>tmpfile&&mv tmpfile myitems.csv
GNUawk
v4.1或更高版本提供了用于就地更新的-i inplace
,上述sed的警告同样适用于此
以上所有变体的边缘大小写:如果是最后一个字符。在输入文件中,恰好是一个单独的
\r
,没有以下\n
,它也将被替换为\n
为了完整性:这里有一些额外的,可能是次优的解决方案: 它们都不提供就地更新,但您可以使用上面介绍的
>tmpfile&&mv tmpfile myitems.csv
习惯用法
使用
tr
:一个非常简单的解决方案,只需删除所有\r
实例;因此,只有当\r
实例仅作为\r\
n序列的一部分出现时,才能使用它;然而,通常情况是:
tr-d'\r'
使用纯
bash
code:注意这会很慢;与tr
解决方案一样,只有当\r
实例仅作为\r\n
序列的一部分出现时,才可以使用此方法
而IFS=$'\r'读取-r行;做
printf'%s\n'$行
完成
$IFS
是内部字段分隔符,将其设置为\r
会导致读取\r
之前的所有内容,如果存在,则读取变量$line
(如果没有\r
,则按原样读取该行)-r
防止读取
解释输入中的\
实例
边缘大小写:如果输入没有以\n
结尾,最后一行将不会打印-您可以使用read-r line | |[-n$line].
dos2unix
在OSX上默认不可用,但用户可以通过brew安装dos2unix
获得它。但是:dos2unix
默认为就地转换文件,因此您可能只需要dos2unix myitems.csv
(第二次指定该文件只需再次尝试转换)。相比之下,如果您想写入不同的输出文件,请使用dos2unix-n myitems.csv new myitems.csv
(适用于OSX和Linux版本)。我认为OP想要走相反的方向-DOS->Unix-原始措辞不清楚,但是cat-v
的输出中存在^M
,以及OSX引用表明这是关于删除\r
(CR)字符。