代码之家  ›  专栏  ›  技术社区  ›  Joel

帮我把这个bash脚本弄得漂亮一点,或者干脆不那么可怕一点

  •  0
  • Joel  · 技术社区  · 16 年前

    我有一个简单的bash脚本,名为 ,它接受一个文件名,并打印出带有行号的文件。

    这是:

    FILE=$1
    line=0;
    numLines=`wc -l $FILE | sed 's/ .*$//'`
    digits=`echo "l($numLines)/l(10)+1" | bc -l`
    digits=`echo "0$digits" | sed 's/\..*$//'`
    for i in `cat $FILE | sed 's/ /_=SPACE=_/g'`; do
      line=`echo $line + 1 | bc`;
      i=`echo $i | sed 's/_=SPACE=_/ /g'`;
      printf "%${digits}d | %s\n" $line "$i"
    done
    

    下面是一个虚构语言的愚蠢源文件:

    var x = 1
    var y = 2
    var z = 3
    func dostuff {
      var a
      var b
      x = x + 1
      y = y + 1
      z = z + 1
      a = x + y + z
      b = a
    }
    

    01 | var x = 1
    02 | var y = 2
    03 | var z = 3
    04 | func dostuff {
    05 |   var a
    06 |   var b
    07 |   x = x + 1
    08 |   y = y + 1
    09 |   z = z + 1
    10 |   a = x + y + z
    11 |   b = a
    12 | }
    

    有(至少)两个功能性问题 :

    • 任何空行都将被忽略-这将中断编号
    • 如果源文件包含制表符,则制表符字符将被视为换行符

    另外,它在某些地方也很粗糙,因为我不太了解bash——特别是用占位符替换空格字符 ,因此我们可以使用 对于 .

    清理这些代码的最好方法是什么,这样就不会有那么多的黑客行为,也不会出现上述功能问题?

    是否有我遗漏的其他功能问题?

    5 回复  |  直到 16 年前
        1
  •  9
  •   SilentGhost    16 年前
    cat -n filename
    
        2
  •  2
  •   Anthony Towns    16 年前

    不要编写脚本来添加行号,按照其他人的建议使用cat-n或grep-n。

    但一般来说,如果要在bash中逐行处理文件,请使用“while read”,例如:

     cnt=0
     cat "$file" | while read line; do
         cnt=$(($cnt+1))
         printf "%02d | %s\n" "$cnt" "$line"
     done
    

    计算所需位数的另一种方法是:

     digits=$(wc -l <"$file" | tr -d '\n' | wc -c)
    

    (wc-l输出行数和换行符,tr删除换行符,wc-c计算所需的字符数)

        3
  •  2
  •   ghostdog74    16 年前

    有几种方法,使用nl或awk等工具

    #nl文件

    或者只是用bash

    while read line; do echo "$i: $line"; i=$((i+1)); done < file
    
        4
  •  0
  •   Aaron Digulla    16 年前

    试试这个:

    egrep -n . /dev/null file | sed -e 's/:/ | /'
    
        5
  •  0
  •   Jonas Elfström    16 年前
    sed = filename.rb | sed 'N;s/\n/ \| /' | sed 's/\(^[0-9] \)/0\1/'
    
    推荐文章