sed 替换命令表现奇怪

sed 替换命令表现奇怪

我正在尝试使用以下行操作文件:

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在您的情况下,第三个捕获组包含示例数据中后面的回车符。使用\3being 0\r\r代表回车符),您可以0\r,在行尾输出。这会输出0,将光标移动到行首,然后输出逗号。

将输入文件转换为 Unix 文本文件。使用诸如 之类的实用程序最容易完成此操作dos2unix

相关内容