如何在 Linux 中的文件的某些列中添加空格

如何在 Linux 中的文件的某些列中添加空格

我有一个包含 1000 行的文本文件,格式如下:

001122 abc def ghi
334455 xyz aaa bbb
667788 ccc ccc ddd

如何使用 Linux 命令通过向某些列添加空格来将其转换为这种格式?

00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

答案1

天真但直接:

$ sed 's/\(..\)\(..\)\(..\)/\1 \2 \3/' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

也就是说,匹配并收集每行的前三组两个字符,并通过在替换字符串中插入空格来将它们隔开。

花哨但需要思考:

$ sed 's/../ &/3; s/../ &/2' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

第一个表达式将..每行的第三个匹配项替换为空格,后跟..匹配的内容。再说一次,但第二场比赛。

答案2

在每个 UNIX 机器上的任何 shell 中使用任何 awk,并让您指定要更改的列并且与该列中的字符无关:

$ awk -v c=1 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd

$ awk -v c=2 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 ab c def ghi
334455 xy z aaa bbb
667788 cc c ccc ddd

$ awk -v c=3 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 abc de f ghi
334455 xyz aa a bbb
667788 ccc cc c ddd

答案3

只需一个简单的 sed 命令即可(filename随实际文件更改):

sed -E 's|([0-9]{2})([0-9]{2})([0-9]{2})[[:blank:]]*(.*)|\1 \2 \3 \4|g' filename

如果要filename就地更改源文件 ( ),请传入-i选项:

sed -i -E 's|([0-9]{2})([0-9]{2})([0-9]{2})[[:blank:]]*(.*)|\1 \2 \3 \4|g' filename

解释:

([0-9]{2})匹配 2 位数字组 3 次

(.*)匹配所有其他内容,即所有字母

[[:blank:]]*匹配空格字符,包括制表符

\1通过\4是匹配的组

请注意,这仅适用于 GNU sed。几乎所有主流 Linux 发行版都附带 GNU Linux。如果您使用的是 macOS,则您的 sed 是 BSD sed,除非您安装的 GNU sed 可用作gsed.

答案4

完全懒得在这里打字,

sed -E "s/([0-9]{2})/\1 /g; s/ +/ /g" file1

在每对数字后面放置一个空格,然后将多个空格减少为单个空格。

或者,也许更懒

sed 's/./& /4;s/./& /2' file1

相关内容