在文本文件的多行的第80列中插入字符

时间:2013-06-04 17:08:51

标签: vim sed awk

我编写了一个多行C宏,出于可读性的考虑,我想在每行的第80列插入字符'\'。一个例子可能有助于理解我需要什么。 假设宏最初是这样的:

#define MY_MACRO \
expression \
a_longer_expression \
 \
a_super_jumbo_size_expression \
macro_ends_here

我希望最终结果如下:

#define MY_MACRO                     \
expression                           \
a_longer_expression                  \
                                     \
a_super_jumbo_size_expression        \
macro_ends_here

因此每行应填充从最后一个非空格字符到第79列的空格,然后在第80列中插入'\',包括空行。

这可能使用vim,sed或awk吗?如果是的话,怎么样?

5 个答案:

答案 0 :(得分:7)

选择所需的范围并输入以下ex命令:

:'<,'>s/\s*\\$/\=repeat(' ', 80-col('.')).'\'

使用表达式替换行的末尾处的空格和\,直到第80列重复一个空格,然后附加\个字符。如果你的行是&gt;它会附加0个空格80个字符,可能不是您想要的,在这种情况下将80更改为79并为字符串添加空格:' \'

答案 1 :(得分:5)

使用g:ve进行vim的一种可能性:

:g/\\$/set ve=all|normal $x80|r\

如果您想在修改后将ve设置回""

:g/\\$/set ve=all|exec 'normal $x80|r\'|set ve=""

awk

 awk '/\\$/{sub(/\\$/,"");$0=sprintf("%s%"80-length($0)"s",$0,"\\")}7' file

答案 2 :(得分:2)

$ cat file
#define MY_MACRO \
expression \
a_longer_expression \
 \
a_super_jumbo_size_expression \
macro_ends_here

$ awk 'sub(/\\$/,"") { $0 = sprintf("%-79s\\",$0) } 1' file
#define MY_MACRO                                                               \
expression                                                                     \
a_longer_expression                                                            \
                                                                               \
a_super_jumbo_size_expression                                                  \
macro_ends_here

答案 3 :(得分:0)

perl -lne 'if(/\\$/){s/[\s]*\\//g;printf "%-79s\\\n",$_}else{print}' your_file

如果你想在原地更改文件:

perl -i -lne 'if(/\\$/){s/[\s]*\\//g;printf "%-79s\\\n",$_}else{print}' your_file

答案 4 :(得分:0)

我希望使用Tabular插件

:Tabularize /\\/l50r0