我试图操纵一个文件,其行如下:
331436218071156,XXXXXXXXXXXXXXX6269,12/28/2018,0使用这个sed命令:
sed -e '/XXXXXXXXX/ s/^\([0-9]*\),XX*[0-9]*,\([^,]*\),\(.*\)$/\2,\1,\3,/' myfile.csv生产这样一条生产线:
12/28/2018,331436218071156,0,相反,我得到了:
,2/28/2018,331436218071156,0为什么输出模式中的第一个字符被替换字符串中的结束,替换?
发布于 2020-02-22 10:25:48
您的输入CSV文件是DOS文本文件。DOS文本文件在每一行的末尾都有一个回车字符。当在Unix系统上输出回车字符时,光标位置会移动到行的开头,任何进一步的输出都会打印在已经输出的位置上。
在您的示例数据中,第三个捕获组包含在0之后的回车字符。\3为0\r (表示回车字符的\r),在行尾输出0\r,。这将输出0,将光标移动到行的开头,并输出逗号。
将输入文件转换为Unix文本文件。这是使用一个实用工具(如dos2unix )最简单的方法。
https://unix.stackexchange.com/questions/569071
复制相似问题