【问题标题】:Insert character in column 80 of multiple lines of a textfile在文本文件多行的第 80 列中插入字符
【发布时间】:2013-05-31 04:35:51
【问题描述】:

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

【问题讨论】:

    标签: vim sed awk


    【解决方案1】:

    选择您想要的范围并输入以下 ex 命令:

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

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

    【讨论】:

      【解决方案2】:

      vim 中使用g: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
      

      【讨论】:

      • awk 会在诸如macro_ends_here 尝试awk '/\\$/{sub(/.$/,"");printf "%s%"80-length"s",$0,"\\\n";next}1' file 之类的行中添加反斜杠
      • @sudo_O 我也找到了,已经修好了。 :) 并且您的建议将打印空行。还是谢谢
      • 整洁的 awk,但只有一个小问题。它在第 79 列而不是第 80 列插入“\”。通过将 ...80-length... 更改为 ...81-length... 来解决此问题。
      【解决方案3】:
      $ 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
      

      【讨论】:

      • !!为什么我忘记了减号!! +1
      • @Kent 仅供参考,您还可以在格式字符串中使用 * 占位符作为填充值作为参数,因此您无需分解格式字符串以使用可变数量的空格,例如sprintf("%s%*s",$0,80-length($0),"\\") 而不是 sprintf("%s%"80-length($0)"s",$0,"\\")
      【解决方案4】:
      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
      

      【讨论】:

        【解决方案5】:

        我会使用 Tabular 插件来实现这一点

        :Tabularize /\\/l50r0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 2014-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-19
          相关资源
          最近更新 更多