在 Vim 中或使用 sed、awk 等将所有带空格的行填充到固定宽度

问题描述 投票:0回答:8

如何将文件的每一行填充到一定宽度(例如 63 个字符宽),并在需要时用空格填充?

目前,我们假设所有行都保证少于 63 个字符。

我使用 Vim,并且更喜欢在那里执行此操作的方法,我可以选择要应用填充的行,然后运行某种

printf %63s current_line
命令。

但是,我当然也愿意使用 sed、awk 或某种 Linux 工具来完成这项工作。

vim sed awk
8个回答
37
投票

维姆

:%s/.*/\=printf('%-63s', submatch(0))

28
投票
$ awk '{printf "%-63s\n", $0}' testfile > newfile

13
投票

在 Vim 中,我会使用以下命令:

:%s/$/\=repeat(' ',64-virtcol('$'))

(使用

virtcol()
函数,而不是
col()
函数, 也以正确处理制表符的必要性为指导 作为文本中可能出现的多字节非 ASCII 字符。)

要计算缓冲区中最长行的长度,可以使用 以下命令:

:let m = max(map(range(1, line('$')), 'virtcol([v:val,"$"])'))

如有必要,可以缩小线条范围。例如,要 对视觉上选择的线做同样的事情,可以提供

map()
range(line("'<"), line("'>"))
参数代替(参见
:help line()
:help '<
)。 (请注意,在后一种情况下, 在可视模式下以交互方式运行命令,需要 删除 Vim 自动放入的
'<,'>
前缀 按下“:”后出现命令行。)

要在单个命令调用中执行这两个步骤,可以将两个步骤结合起来 使用

|
命令。例如,填充视觉上选定的行 (或上次视觉选择中的行),运行:

:let m = max(map(range(line("'<"), line("'>")), 'virtcol([v:val,"$"])')) | '<,'>s/$/\=repeat(' ',m-virtcol('$'))

3
投票

只是为了好玩,Perl 版本:

$ perl -lpe '$_ .= " " x (63 - length $_)'

3
投票

这可能对你有用:

$ sed -i ':a;/.\{63\}/!{s/$/ /;ba}' file

或者也许更高效但不太优雅:

$ sed -i '1{x;:a;/.\{63\}/!{s/^/ /;ba};x};/\(.\{63\}\).*/b;G;s//\1/;y/\n/ /' file

2
投票

看起来您很习惯使用 vim,但这里有一个纯 Bash/simple-sed 解决方案,以防您需要从命令行执行此操作(请注意 sed 替换中的 63 个空格):

$ sed 's/$/                                                               /' yourFile.txt |cut -c 1-63

2
投票

使用 sed,不带循环:

$ sed -i '/.\{63\}/!{s/$/                                                                /;s/^\(.\{63\}\).*/\1/}' file

确保第一次替换中有足够的空格以匹配您要添加的空格数。


2
投票

另一个 Perl 解决方案:

$ perl -lne 'printf "%-63s\n", $_' file
© www.soinside.com 2019 - 2024. All rights reserved.