Linux tr-s无法压缩连续的空格
下面是我试图处理的文本文件的一个片段:Linux tr-s无法压缩连续的空格,linux,bash,shell,tr,Linux,Bash,Shell,Tr,下面是我试图处理的文本文件的一个片段: 845136006577 1.0 845136006638 4.0 845136006676 6.0 845136007895 3.0 845136007970 7.0 845136008052 9.0 845136008175 4.0 845136008298
845136006577 1.0
845136006638 4.0
845136006676 6.0
845136007895 3.0
845136007970 7.0
845136008052 9.0
845136008175 4.0
845136008298 4.0
845136008373 4.0
845136008410 4.0
845136008557 3.0
845136008595 4.0
我试图将每行上的所有空格压缩为一个,
(逗号)
以下是我尝试过的:
tr-s'[:space:'',
tr-s'',
但输出总是如下所示:
845136006577,,,,,,,,,,,,,,1.0,
845136006638,,,,,,,,,,,,,,4.0,
845136006676,,,,,,,,,,,,,,6.0,
845136007895,,,,,,,,,,,,,,3.0,
845136007970,,,,,,,,,,,,,,7.0,
845136008052,,,,,,,,,,,,,,9.0,
845136008175,,,,,,,,,,,,,,4.0,
845136008298,,,,,,,,,,,,,,4.0,
845136008373,,,,,,,,,,,,,,4.0,
我的文件是否存在潜在的编码问题?有点不对
更新
xxd
的输出片段:
00003b0: 3600 3000 3000 3800 3500 3500 3700 2000 6.0.0.8.5.5.7. .
00003c0: 2000 2000 2000 2000 2000 2000 2000 2000 . . . . . . . .
00003d0: 2000 2000 2000 2000 2000 3300 2e00 3000 . . . . .3...0.
00003e0: 2000 0a00 3800 3400 3500 3100 3300 3600 ...8.4.5.1.3.6.
00003f0: 3000 3000 3800 3500 3900 3500 2000 2000 0.0.8.5.9.5. . .
0000400: 2000 2000 2000 2000 2000 2000 2000 2000 . . . . . . . .
0000410: 2000 2000 2000 2000 3400 2e00 3000 2000 . . . .4...0. .
0000420: 0a00 3800 3400 3500 3100 3300 3600 3000 ..8.4.5.1.3.6.0.
0000430: 3000 3800 3600 3900 3400 2000 2000 2000 0.8.6.9.4. . . .
0000440: 2000 2000 2000 2000 2000 2000 2000 2000 . . . . . . . .
0000450: 2000 2000 2000 3500 2e00 3000 2000 0a00 . . .5...0. ...
0000460: 3800 3400 3500 3100 3300 3600 3000 3000 8.4.5.1.3.6.0.0.
您的输入被编码为UTF-16(或UCS-2),但您读取它时就像它是ASCII(或UTF-8、ISO-8859或类似),因此您可以看到交替的ASCII和null值 因此,所有空间似乎都由NUL分隔,不会合并 一种解决方法是通过管道通过iconv并返回(假设您希望结果采用相同的编码):
iconv-f utf-16-t utf-8\
|tr-s'[:空白:'''\
|iconv-f utf-8-t utf-16
显然,如果希望输出为UTF-8格式,可以跳过最后的重新编码步骤
您无法使
tr
或其他标准实用程序与UTF-16或UCS-2协同工作,因此,如果您不想更改为Perl或Python,这可能是最好的方法。您的输入被编码为UTF-16(或UCS-2),但您在读取它时就好像它是ASCII(或UTF-8、ISO-8859或类似),所以您可以看到交替的ASCII和null值
因此,所有空间似乎都由NUL分隔,不会合并
一种解决方法是通过管道通过iconv并返回(假设您希望结果采用相同的编码):
iconv-f utf-16-t utf-8\
|tr-s'[:空白:'''\
|iconv-f utf-8-t utf-16
显然,如果希望输出为UTF-8格式,可以跳过最后的重新编码步骤
您无法使
tr
或其他标准实用程序与UTF-16或UCS-2一起在本机工作,因此,如果您不想更改为Perl或Python,这可能是最好的方法。由于文件中充满了空字符,您可以在使用tr处理之前删除它们(假设您不需要任何空字符)
与tr合作两次
tr -d '\0' < file | tr -s '[:blank:]' ','
或者如果你想保留你的编码
perl -pe 's/([[:blank:]]\x00)+/,\x00/g' file
或者可能是最可靠的,您可以将perl的编码设置为读取
perl -Mopen=":std,:encoding(utf-16le)" -pe 's/[[:blank:]]+/,/g' test
由于文件中充满了空字符,您可以在使用tr处理之前删除它们(假设您不希望其中包含任何空字符) 与tr合作两次
tr -d '\0' < file | tr -s '[:blank:]' ','
或者如果你想保留你的编码
perl -pe 's/([[:blank:]]\x00)+/,\x00/g' file
或者可能是最可靠的,您可以将perl的编码设置为读取
perl -Mopen=":std,:encoding(utf-16le)" -pe 's/[[:blank:]]+/,/g' test
@尤金尼什<代码>-s是压缩重复。是的,文件有问题,适合我。也可以考虑使用<代码> [B:::/COD],而不是<代码> [S:::[COD:>代码]来保存新行(假设您想)@ PyrSybBar可以运行<代码> XXD>文件< /代码>并将输出输出到您的问题中吗?@ 123更新帖子,输出“代码> XXD < /COD> >,看来您正在读取UTF 16,就好像它是ASCII一样,UTF-8或ISO-8859。@EugeneSh<代码>-s是压缩重复。是的,文件有问题,适合我。也可以考虑使用<代码> [B:::/COD],而不是<代码> [S:::[COD:>代码]来保存新行(假设您想)@ PyrSybBar可以运行<代码> XXD>文件< /代码>并将输出输出到您的问题中吗?@ 123更新帖子,输出“代码> XXD < /COD> >,看来您正在读取UTF 16,就好像它是ASCII一样,UTF-8或ISO-8859.UTF-16语言环境不适用于Linux,因为编码字符串与C不兼容;你打字的时候我发现了!我将对其进行编辑以合并information@TobySpeight如果我运行这个命令,它会在文件的开头插入
fffe
?是@123(因为我们没有权限显示hextump的开头,我们无法判断它是否以字节顺序标记开始)。您可以对没有BOM的流使用utf-16be
或utf-16le
(视情况而定)。@TobySpeight只是觉得很奇怪,当它接受没有BOM的输入时,会插入它。不要经常使用iconv,有没有办法指定endianness?Linux不存在UTF-16语言环境,因为编码字符串与C不兼容。谢谢,@thatotherguy;你打字的时候我发现了!我将对其进行编辑以合并information@TobySpeight如果我运行这个命令,它会在文件的开头插入fffe
?是@123(因为我们没有权限显示hextump的开头,我们无法判断它是否以字节顺序标记开始)。您可以对没有BOM的流使用utf-16be
或utf-16le
(视情况而定)。@TobySpeight只是觉得很奇怪,当它接受没有BOM的输入时,会插入它。不要经常使用iconv,有没有办法指定endianness?托比的回答也是一个很好的方法。但这一个直接解决了问题,对我的案例有效。谢谢。我本来打算建议使用Perl方法(使用:encoding
),但后来被拖到了现实生活中,所以谢谢你把它包括进来。Toby的回答也是一个很好的方法。但这一个直接解决了问题,对我的案例有效。谢谢。我本来打算建议使用Perl方法(使用:encoding
),但后来被拖到了现实生活中,所以谢谢你把它包括进来。