如何在 Vim 中将所有带空格的行填充到固定宽度(也许使用 sed、awk 等)?

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

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

为简单起见,我们假设所有行都保证少于 63 个字符。

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

printf %63s current_line
命令。

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

vim sed awk
8个回答
38
投票

维姆

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

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

14
投票

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

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

(使用

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


计算缓冲区中最长行的长度(使用 代替 64),可以使用以下命令:

: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('$'))

如果经常使用,可以将此组合命令绑定到按键映射。 以下是要添加的可视模式键映射的示例实现 到

.vimrc
文件:

vnoremap <silent> <leader><bar> :call RightPadLines(' ', +0)<cr>
func! RightPadLines(char, extra) range
    let m = max(map(range(a:firstline, a:lastline), 'virtcol([v:val, "$"])'))
    let m += a:extra
    sil exec $'{a:firstline},{a:lastline}' 's/$/\=repeat(a:char, m-virtcol("$"))'
endfunc

这里的键盘快捷键是前导键(参见

:help mapleader
),然后是 通过
|
 键,但是当然可以使用任何组合。


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.