我正在尝试使用以下行操作文件:
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
为什么输出模式中的第一个字符被,
替换字符串中的结尾替换?
您的输入 CSV 文件是一个 DOS 文本文件。DOS 文本文件在每一行的最后都有一个回车符。当在 Unix 系统上输出回车符时,光标位置将移动到行首,并且任何进一步的输出都将打印在已经存在的内容上。
0
在您的情况下,第三个捕获组在您的示例数据之后包含回车符。使用(\3
表示回车字符),您在行尾输出。这将输出,将光标移动到行首,并输出逗号。0\r
\r
0\r,
0
将您的输入文件转换为 Unix 文本文件。使用诸如
dos2unix
.