帮助我使这个bash脚本漂亮,或者只是不那么可怕

时间:2009-10-02 08:10:37

标签: bash

我有一个简单的bash脚本,名为 print_code.sh ,它采用文件名,并打印出带行号的文件。

这是:

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 | }

print_code.sh (至少)有两个功能问题:

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

此外,它在某些地方是hackish,因为我不太了解bash - 特别是用占位符 = SPACE = 替换空格字符,所以我们可以使用的的

这个代码可以清理的最佳方法是什么,而不是那种hackish,以及上述功能问题消失了?

我是否还有其他任何功能问题?

5 个答案:

答案 0 :(得分:9)

cat -n filename

答案 1 :(得分:2)

不要编写脚本来添加行号,使用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计算需要的字符数)

答案 2 :(得分:2)

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

#nl file

#awk'{print NR,$ 0}'文件

或仅使用bash

while read line; do echo "$i: $line"; i=$((i+1)); done < file

答案 3 :(得分:0)

试试这个:

egrep -n . /dev/null file | sed -e 's/:/ | /'

答案 4 :(得分:0)

sed = filename.rb | sed 'N;s/\n/ \| /' | sed 's/\(^[0-9] \)/0\1/'