是否可以仅用每个选项卡的一定数量的空格替换“前导选项卡”?我将前导制表符定义为仅以制表符或空格开头的制表符。我将前导或缩进选项卡定义为仅以空格开头的选项卡。
我的 . 中有以下一行.nexrc
,抄自这一行。它通过过滤器运行包含标记a
和标记的行之间的行。b
替换标签。
map \2 'a!'b pr -te2
但是,它很好地用两个空格替换了非前导制表符,这并不理想,因为有时需要文字制表符。
是否有一种简单且便携的方法可以仅用每个选项卡的一定数量的空格替换前导选项卡?
以下 perl 脚本(可以折叠为单行)使用命令行上提供的宽度替换前导制表符的工作,但它依赖于 Perl 的可用性并且需要二次时间(如果文件不包含任何内容但标签)。
#!/usr/bin/env perl
use strict;
use warnings;
my ($width) = @ARGV;
$width //= 2;
my $replacement = ' ' x $width;
while (<>) {
while (s/^(\s*)\t/$1$replacement/g) { }
print;
}
这是我想要发生的事情的一个例子。^I
指的是制表符字节,#
是行首的零宽度标记。下面的行是一个字节标尺。
前:
#^I^I ^Ia^Ib
# 1 23 45 67
之后(标签宽度为 2)
# a^Ib
#12345678 90
之后(标签宽度为 4)
# a^Ib
#12345678901234 56
如果您正在寻找使用其他命令行工具的通用解决方案,则可以使用
Awk
它。Tab上面的命令用一个空格替换了更多的出现,即 . 中的第二个参数
gsub
。您可以通过生成所需的空间来使其可配置从上次更新开始,似乎 OP 想要用找到的确切空格数替换前导选项卡的数量,
逻辑是将字段分隔符设置为
\t
,可以通过 do 来识别前导选项卡的数量NF-1
。确定前导选项卡的数量后,使用它从早期sprintf()
方法生成相同数量的空格。您可以通过验证
hexdump -C
更换之前和之后看到它现在更换