Bash 如何将文件中的前四个空格转换为制表符

Bash 如何将文件中的前四个空格转换为制表符,bash,shell,Bash,Shell,我有一个abc.txt文件,它在某些行上有空格。有些行有4个空格,而有些行有4个以上的空格。我想把前4个空格转换成一个标签,留下剩余的空格。我试过了 unexpand-t4——首先只有abc.txt>efg.txt和一些sed等价物。他们将我所有的空格都转换为tab,但不只是4个空格序列的第一次出现。如何在shell和ruby中实现这一点?您可以使用sed轻松做到这一点: sed "s/^ /$(printf '\t')/g" abc.txt > efg.txt 有关为什么需要$(

我有一个abc.txt文件,它在某些行上有空格。有些行有4个空格,而有些行有4个以上的空格。我想把前4个空格转换成一个标签,留下剩余的空格。我试过了


unexpand-t4——首先只有abc.txt>efg.txt和一些sed等价物。他们将我所有的空格都转换为tab,但不只是4个空格序列的第一次出现。如何在shell和ruby中实现这一点?

您可以使用
sed轻松做到这一点:

sed "s/^    /$(printf '\t')/g" abc.txt > efg.txt
有关为什么需要
$(printf'\t')
的更多信息,请查看。正如在另一份答复中所述并在评论中详细讨论的那样,这种模式也可以表示为:

sed "s/^ \{4\}/$(printf '\t')/g" abc.txt > efg.txt
根据您的偏好,您可能会发现其中一个或多或少是明确的,并且容易理解。

在ruby中:

'/path/to/file'.tap do |file|
  File.write(file, File.read(file).gsub(/^ {4}/, "\t"))
end

为了避免将整个文件加载到内存中,请改用。

您能显示您的输入和输出文件吗?这对我来说很好,没有任何问题。这项工作正常,但它创建了一个8空间的选项卡,而不是4空间的选项卡。选项卡就是一个选项卡。它的显示方式与您正在查看的程序的配置有关。大多数程序默认为
8
的制表位。您使用哪个程序查看该文件?在上下文中,下面是如何在bash:或vi:中将tabstop设置为4的:如果文件不太大,并且希望在原地进行更改,则可以在此处使用
scape
moreutils
)!您也可以使用
-i
选项进行与sed内联的更改。我认为这不是必需的/可取的,因为OP列出了不同的输入/输出文件。一般来说,
-i
sed选项被看不起,取而代之的是:
sed s'/find/replace'In.txt>In.txt.tmp和&mv In.txt.tmp In.txt
。。。这是一个非常标准的shell习惯用法,用于幂等替换文件。这看起来像是将整个文件读入内存、subs,然后将整个文件写回磁盘,而不是逐行操作?我还发现`{4}`模式很有趣,因为四个字面值空格和`{4}`模式正好有四个空格宽。@MatthewStory是的,这不是最有效的版本,在现实生活中,如果文件的大小非常大,我会选择
sed
。我也宁愿被告知“这是4个空格(即,`{4}”)即使是相同的字符长度,我也必须计算出我自己的空格数…并明确表示“是的,我想要4个空格”,而不是“我的猫坐在我的空格键上,我们最终得到了4个空格。”“…而且,如果他们决定想要6个空格或者什么都不想要,更容易更改。@SimpleTime是的。。。我可以走任何一条路。我也考虑过在我的解决方案中使用“{4}”,只是觉得它们的长度相同有点可笑。绝对不是在四个字格上批评使用那种风格,只是分享一个观察。啊,是的,在我最初的阅读中,我读到你对它的评论更多的是一种被动攻击,我进入了辩论模式,不到5分钟就重新读了一遍,它肯定没有我想象的那么被动攻击。