我的数据如下所示:
$ 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