如何在文件中的各个数字之间插入空格?

如何在文件中的各个数字之间插入空格?

我的数据如下所示:

$ cat input
1212103122
1233321212
0000022221

我希望输出看起来像这样:

$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1

我试过:

sed -i 's// /g' input > output

但它不起作用。

有什么建议么?

答案1

这对我有用:

sed 's/./& /g' input > output

$ cat input
1212103122
1233321212
0000022221

$ cat output
1 2 1 2 1 0 3 1 2 2 
1 2 3 3 3 2 1 2 1 2 
0 0 0 0 0 2 2 2 2 1 

答案2

给你:

sed 's/\(.\{1\}\)/\1 /g' input > output

如果您想就地保存更改:

sed -i 's/\(.\{1\}\)/\1 /g' input

怎么运行的:

s/\(.\{1\}\)/\ /g将在每 1 个字符后添加一个空格。

例如,如果您想要一个如下输出文件:

12 12 10 31 22
12 33 32 12 12
00 00 02 22 21

您可以将我的答案编辑为:

sed -i 's/\(.\{2\}\)/\1 /g'

所以它会在每 2 个字符后添加一个空格。

另外, 与 ,/\1 /相同/&,并且会添加一个空格。例如,添加三个:/\1 //& /。您还有更多选项可供使用。 Sed 是一个超级强大的工具。

此外是的,正如@Law29提到的,如果您不删除,这将在每行末尾留下一个空格,因此要在添加空格时删除它们,您可以在s/ $//给定解决方案的末尾添加 a ,这样做:

sed 's/./& /g; s/ $//'

我希望这能有所帮助。

答案3

您可以-i选择就地编辑文件。这可能会阻碍您找到正确的解决方案。

你的问题是你试图匹配一个空字符串,这sed是不允许的。相反,匹配任意一个字符,并将其替换为相同字符后跟一个空格。这将在每行末尾留下一个空格,您可以使用另一个 sed 将其删除。

$ cat input 
1212103122
1233321212
0000022221
$ sed -e 's/./& /g' -e 's/ $//' input > output
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
$ 

答案4

这是一个awk选项:

awk -F '' '{$1=$1}1' input > output

工作原理是:

  • 通过设置空字段分隔符-F '',我们将输入记录(行)拆分为单个字符

  • 通过评估,$1=$1我们强制使用默认输出字段分隔符(这是一个空格)重新构建记录

  • 1是 true 所以打印结果


Perl 中的类似技巧:

perl -F'' -alne 'print join " ", @F' input > output

为了显示:

$ awk -F '' '{$1=$1}1' input
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1

相关内容