将文件中空格转换为TAB
1. 概述
将空格转换为制表符是一种常见的要求,反之亦然。程序员通常需要这样做以遵循项目的编码指南。幸运的是,大多数流行的 IDE 和编辑器都为其提供了内置支持。
在本教程中,我们将讨论一些在命令行中用制表符替换空格的方法。
2. 设置
通常,空白 包含水平和垂直空白字符。此外,Unicode 字符集 定义了一些额外的空白字符
在本教程中,当我们提到空白时,它表示 ASCII 水平空白字符。
现在,让我们创建一个带有一些空格的简单文本文件作为示例:
$ cat --show-tabs input.txt
The quick brown fox jumps over
the lazy dog
在上面的示例中,我们使用了cat 命令的*–show-tabs选项。如果我们的输入文件中有任何TAB字符,它们将显示为^I*。请注意, input.txt文件中没有任何选项卡。因此,我们在输出中看不到任何*^I*字符。
3. 使用tr命令
当我们想要翻译或删除字符时, tr 命令很有用。我们可以使用它将空格转换为TAB字符:
$ tr " " "\t" < input.txt > output.txt
$ cat --show-tabs output.txt
The^I^Iquick^I^I^I^I^Ibrown^I^I^Ifox^I^I^Ijumps^I^I^Iover
^I^I^Ithe^Ilazy^I^I^I^I^I^I^Idog
在此示例中,我们将每个空格替换为TAB字符。但是,有时需要用单个TAB字符替换多个空格。我们可以使用tr命令的*-s*选项轻松实现这一点:
$ tr -s " " "\t" < input.txt > output.txt
$ cat --show-tabs output.txt
The^Iquick^Ibrown^Ifox^Ijumps^Iover
^Ithe^Ilazy^Idog
在此示例中,-s表示挤压重复操作,它将多个空格替换为单个TAB字符。
4. 使用awk命令
awk 命令是AWK编程语言的解释器。它是执行复杂文本处理的非常强大的工具。借助awk命令,我们可以轻松地将空格转换为TAB字符。
默认情况下,AWK使用 [ \t\n]+ 作为字段 分隔符 *(FS)*并使用空格字符作为输出字段分隔符 (OFS)。
我们可以设置两个变量来解决我们的问题:
$ awk -F'[[:blank:]]' -v OFS="\t" '{$1=$1; print}' input.txt > output.txt
$ cat --show-tabs output.txt
The^I^Iquick^I^I^I^I^Ibrown^I^I^Ifox^I^I^Ijumps^I^I^Iover
^I^I^Ithe^Ilazy^I^I^I^I^I^I^Idog
在上面的命令中,我们将TAB字符设置为输出字段分隔符。此外,我们将一个水平空白字符设置为字段分隔符。
因此, awk读取由单个空格字符分隔的字段,并以 TAB 分隔输出它们。
如果我们不设置FS变量, awk将用单个TAB字符替换多个空白字符:
$ awk -v OFS="\t" '{$1=$1; print}' input.txt > output.txt
$ cat --show-tabs output.txt
The^Iquick^Ibrown^Ifox^Ijumps^Iover
the^Ilazy^Idog
到目前为止,我们已经使用awk解决了这个问题。
然而,好奇的眼睛可能会发现“ $1=$1 ”看起来很奇怪,因为它似乎什么也没做。
实际上,它是两个awk命令的关键。设置字段时,无论值是否更改, awk都会将一些内部变量,例如OFS应用于记录。在这里,我们希望 awk 将我们定制的OFS应用于记录。因此,我们重置一个字段来触发它。
如果我们在不设置至少一个字段的情况下打印记录,则awk不会将新的OFS应用于记录:
$ awk -v OFS="\t" '{print}' input | cat --show-tabs
The quick brown fox jumps over
the lazy dog
从上面的输出中我们可以看到,尽管我们设置了OFS=”\t” ,但awk的输出中没有TAB。 awk按原样输出文件内容,不做任何更改。
5. 使用sed命令
sed 是一个用于过滤和转换文本的流编辑器。**我们可以使用它的替换命令**将空格转换为制表符:
$ sed 's/[[:blank:]]/\t/g' input.txt > output.txt
$ cat --show-tabs output.txt
The^I^Iquick^I^I^I^I^Ibrown^I^I^Ifox^I^I^Ijumps^I^I^Iover
^I^I^Ithe^Ilazy^I^I^I^I^I^I^Idog
在此示例中,“s”字符表示替换命令,而*“g”表示对所有匹配模式执行操作的全局*标志。
我们可以使用 sed 命令的扩展正则表达式 将多个空格转换为单个TAB字符:
$ sed 's/[[:blank:]]\+/\t/g' input.txt > output.txt
$ cat --show-tabs output.txt
The^Iquick^Ibrown^Ifox^Ijumps^Iover
^Ithe^Ilazy^Idog
由于sed默认使用 BRE,我们需要对 ’ + ’ 字符进行转义以使其具有特殊含义:匹配出现的一个或多个空格。
6. 使用vim编辑器
Vim 是 Linux 中最流行和最强大的文本编辑器之一。它支持多种模式。我们可以使用它的EX模式命令进行字符转换:
$ cat --show-tabs input.txt
The quick brown fox jumps over
the lazy dog
$ vim input.txt
:%s/\s/\t/g # execute this command in Vim's ex mode
:wq # execute this command in Vim's ex mode
$ cat --show-tabs input.txt
The^I^Iquick^I^I^I^I^Ibrown^I^I^Ifox^I^I^Ijumps^I^I^Iover
^I^I^Ithe^Ilazy^I^I^I^I^I^I^Idog
我们可以稍微调整*:s命令以用单个TAB*字符替换多个空格:
:%s/\s\+/\t/g
:wq
$ cat --show-tabs input.txt
The^Iquick^Ibrown^Ifox^Ijumps^Iover
^Ithe^Ilazy^Idog
Vim 默认对 Regex 模式使用*magic *。因此,我们需要对“ + ”字符进行转义以赋予其特殊含义:匹配模式一次或多次。
Vim 支持在读取文件后自动执行一些Ex命令:
vim "+ExCommand" "+ExCommand" "+ExCommand" .. file
也就是说,除了在 Vim 编辑器中打开文件并交互执行*:s*命令外,我们还可以使用 Vim 作为文本处理命令来进行替换:
$ vim "+%s/\s\+/\t/g" "+wq" input.txt
$ cat --show-tabs input.txt
The^Iquick^Ibrown^Ifox^Ijumps^Iover
^Ithe^Ilazy^Idog