使用扩展命令在 Linux 终端中将制表符转换为空格

关于在编程中使用制表符和空格的争论是永无止境的。

虽然您可能更喜欢一直使用制表符,但您的编码指南很可能建议使用空格。

但是,如果您已经在程序中的任何地方使用了制表符,并且您需要将这些制表符转换为空格,以便审阅者允许您的代码,那么您来对地方了。

在本教程中,我将向您展示如何在 Linux 命令行中将文本文件中的制表符转换为空格。

在 Linux 命令行中使用 expand 命令将制表符转换为空格

我正在使用这个示例文本文件,它是一个简单的 C++ 程序,用于检查奇数和偶数。 这是文件的内容:

你可以 下载这个文件 如果您想在遵循本教程的同时练习命令,请从这里开始。

检查您的文本文件是否有标签

有几种方法可以做到这一点。 我发现最简单的方法是使用 cat 命令。

您可以使用带有选项 -T 的 cat 命令,并将所有选项卡显示为 ^I 在屏幕上 (stdout)。

cat -T tab_file

您可以看到文件中选项卡的位置。

#include
using namespace std;
int main()
{
^Iint n;
^Icout << “Enter a number:^I“;
^Icin >> n;
^I
^Iif (n%2 == 0) {
^I^Icout<<n<< “is an even Number”;
^I}
^Ielse
^I^Icout<<n<< “is an odd Number”;
^Ireturn 0;
}
带有标签的文件

使用 expand 命令将制表符转换为空格

如果对文件使用 expand 命令,它会将所有选项卡转换为 8 个空格的块,并在屏幕上显示输出。

expand tab_file

但这不是很方便,不是吗? 你几乎看不到这里的变化。 一个更好的主意是将输出保存到另一个文件。

expand tab_file > space_file

现在,如果您使用 cat 命令查看该文件,您将不会再找到任何选项卡。

所有制表符都转换为空格所有制表符转换为 8 个空格(默认)

减少空格数

正如我在上一节中提到的,默认情况下,一个制表符等于 8 个空格。 如果您的代码有如此大的缩进,那看起来会非常奇怪。

好消息是您可以使用 -t 选项更改默认空间大小。

expand -t N tab_file

为了 example,如果您必须将每个选项卡更改为 2 个空格,则可以使用如下展开命令:

expand -t2 tab_file > space_file
制表符转换为缩小尺寸的空格所有制表符转换为 2 个空格

仅将前导制表符转换为空格

通常在程序中,您只想转换前导制表符,即行首的制表符。 您不想触摸实际上是代码一部分的行之间的选项卡。

Expand 也提供此选项。 如果只想将前导制表符转换为空格,请使用 -i 选项.

如果我们继续前面的 example,这是命令的样子:

expand -t2 -i tab_file > space_file
仅将前导制表符转换为空格只有前导制表符转换为空格

将制表符转换为空格并保存到原始文件

在上述所有示例中,您已将转换后的文件保存到新文件中。 但是,如果您的目标是通过将制表符转换为现有程序文件的空格来清理代码,您可能希望将输出保存在原始文件本身中。

为此,您可以使用 海绵命令. Sponge 在将其写入输出之前“吸收”整个标准输入。 当您尝试更改和保存同一个文件时,这非常有用。

现在,海绵命令可能在您的系统上不可用。 你必须安装 更多实用程序 包裹。 它应该可用

在基于 Ubuntu/Debian 的发行版上,您可以使用此命令安装 moreutils:

sudo apt install moreutils

安装后,您可以在以下功能中使用它:

expand -t2 -i tab_file | sponge tab_file

将目录中所有匹配文件中的制表符转换为空格

到目前为止,您学到的任何东西都适用于单个文件。 但是,如果您有一个包含多个程序文件的项目,并且您想将所有程序文件中的制表符转换为空格,那么您必须在这里更聪明一点。

到目前为止,我们所学到的可以与宏伟的 find 和 exec 命令结合使用。

find . -name '*.cpp' -type f -exec bash -c 'expand -t 4 "$0" | sponge "$0"' {} ;

上面的命令找到所有以扩展名cpp结尾的文件,将这些文件传递给expand命令,expand命令在海绵命令的帮助下将输出写入原始文件。

您可能认为此时使用 sed 命令会更容易,但这完全是您的选择。