使用扩展命令在 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 命令:

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 命令会更容易,但这完全是您的选择。

相关阅读:

Posted in: LinuxTags: ,