linux - tr -s 无法压缩连续空格

标签 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              4.0
845136008373              4.0
845136008410              4.0
845136008557              3.0
845136008595              4.0

我正在尝试将每行上的所有空格压缩为一个 , (逗号)。

这是我尝试过的:

tr -s '[:space:]' ',' < file.txt

tr -s ' ' ',' < file.txt

但是输出总是这样:

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 < file.txt 的输出片段:

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.

最佳答案

由于文件中充满了空字符,您可以在使用 tr 处理之前删除它们(假设您不希望其中有任何空字符)。

用 tr 两次

tr -d '\0' < file | tr -s '[:blank:]' ','

使用单个 perl

perl -pe 's/\x00//g;s/[[:blank:]]+/,/' file

或者如果你想保留你的编码

perl -pe 's/([[:blank:]]\x00)+/,\x00/g' file

或者可能最稳健,您可以设置 perl 的编码以读取。

perl -Mopen=":std,:encoding(utf-16le)" -pe 's/[[:blank:]]+/,/g' test

关于linux - tr -s 无法压缩连续空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44682303/

相关文章:

linux - Ubuntu 上的 Postgresql 编辑出错。每次使用 sudo apt-get install 都会出错

linux - 是否可以在不复制参数字符串的情况下读取符号链接(symbolic link)值?

linux - 根据文件类型对文件进行排序

bash - Shell 脚本退出代码 - 无法设置

bash - Vim:读取输入错误

linux - 如何编辑字符串中的特定输出?

c++ - 解析 PLT stub 地址和名称

shell - 如何使用 echo 命令写入和附加到文件

android - 获取通过 ADB 连接的设备的 Android 操作系统版本

bash - 在 bash 中将比较输出打印为 bool 值