Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 从CSV中删除\r(CR)_Macos_Csv_Sed_Newline - Fatal编程技术网

Macos 从CSV中删除\r(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

在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
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
字符,因为BSD
sed
(在OS X上使用的一个)本机无法识别此类转义序列(请注意,在Linux发行版上使用的GNU
sed
) 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'
BSD
awk
不提供就地更新选项,因此您必须在不同的文件中捕获输出;要使用临时文件并在以后替换原始文件,请使用以下习惯用法:

awk'{sub(“\r$”,“”);print}'myitems.csv>tmpfile&&mv tmpfile myitems.csv
GNU
awk
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)字符。