0

我编写了一个多行 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 吗?如果是,如何?

4

5 回答 5

7

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

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

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

于 2013-06-04T17:17:44.097 回答
5

vim 中使用g:and的一种可能性ve

: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
于 2013-06-04T17:29:36.397 回答
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
于 2013-06-04T18:40:09.163 回答
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
于 2013-06-05T06:52:44.760 回答
0

我会用表格插件来做这个

:Tabularize /\\/l50r0
于 2013-06-16T13:15:34.887 回答