我有一个简单的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,以及上述功能问题消失了?
我是否还有其他任何功能问题?
答案 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/'