如何将文件的每一行填充到一定宽度(例如 63 个字符宽),并在需要时用空格填充?
目前,我们假设所有行都保证少于 63 个字符。
我使用 Vim,并且更喜欢在那里执行此操作的方法,我可以选择要应用填充的行,然后运行某种
printf %63s current_line
命令。
但是,我当然也愿意使用 sed、awk 或某种 Linux 工具来完成这项工作。
:%s/.*/\=printf('%-63s', submatch(0))
$ awk '{printf "%-63s\n", $0}' testfile > newfile
在 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('$'))
只是为了好玩,Perl 版本:
$ perl -lpe '$_ .= " " x (63 - length $_)'
这可能对你有用:
$ sed -i ':a;/.\{63\}/!{s/$/ /;ba}' file
或者也许更高效但不太优雅:
$ sed -i '1{x;:a;/.\{63\}/!{s/^/ /;ba};x};/\(.\{63\}\).*/b;G;s//\1/;y/\n/ /' file
看起来您很习惯使用 vim,但这里有一个纯 Bash/simple-sed 解决方案,以防您需要从命令行执行此操作(请注意 sed 替换中的 63 个空格):
$ sed 's/$/ /' yourFile.txt |cut -c 1-63
使用 sed,不带循环:
$ sed -i '/.\{63\}/!{s/$/ /;s/^\(.\{63\}\).*/\1/}' file
确保第一次替换中有足够的空格以匹配您要添加的空格数。
另一个 Perl 解决方案:
$ perl -lne 'printf "%-63s\n", $_' file