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