vim或sed / awk / etc - 用空格填充所有行到固定宽度

时间:2012-02-22 12:06:19

标签: vim sed awk

如何将文件的每一行填充到一定的宽度(比如63个字符宽),如果需要填充空格?

现在,让我们假设所有行都保证少于63个字符。

我使用vim并且更喜欢在那里进行操作(是否有某种printf %63s current_line命令?)我可以在其中选择我想要应用填充的行。

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

欢呼声。

8 个答案:

答案 0 :(得分:31)

vim

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

答案 1 :(得分:23)

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

答案 2 :(得分:7)

在Vim中,我会使用命令

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

如果要填充的文本仅为ASCII且不包含制表符,则为 可以使用col()代替virtcol()

答案 3 :(得分:1)

这可能对您有用:

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

或者更有效但不那么优雅:

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

答案 4 :(得分:1)

只是为了好玩,Perl版本:

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

答案 5 :(得分:1)

使用sed,无循环:

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

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

答案 6 :(得分:0)

另一个Perl解决方案:

perl -lne 'printf "%-63s\n", $_' file

答案 7 :(得分:0)

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

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