我编写了一个多行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吗?如果是的话,怎么样?
答案 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