Помогите мне сделать этот скрипт bash красивым или просто менее страшным - PullRequest
0 голосов
/ 02 октября 2009

У меня есть простой 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 :

  • Любые пустые строки будут игнорироваться - что приведет к нарушению нумерации
  • Если исходный файл содержит вкладки, символ вкладки будет обрабатываться как символ новой строки

Кроме того, местами он хакерский, потому что я не очень хорошо знаю bash - особенно заменив символ пробела заполнителем = SPACE = , поэтому мы можем перебирать каждую строку, используя для .

Как лучше всего очистить этот код, чтобы он не был таким хакерским, и чтобы вышеуказанные функциональные проблемы исчезли?

Есть ли другие функциональные проблемы, которые я пропустил?

Ответы [ 5 ]

9 голосов
/ 02 октября 2009
cat -n filename
2 голосов
/ 02 октября 2009

несколькими способами, используя такие инструменты, как nl или awk

# файл nl

# awk '{print NR, $ 0}' file

или просто с bash

while read line; do echo "$i: $line"; i=$((i+1)); done < file
2 голосов
/ 02 октября 2009

Не пишите скрипт для добавления номеров строк, используйте 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

(здесь вам не нужно использовать cat и pipe, перенаправление тоже работает отлично)

Другой способ определить количество необходимых цифр:

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

(wc -l выводит количество строк и новую строку, tr удаляет новую строку, wc -c считает, сколько символов нужно)

0 голосов
/ 02 октября 2009
sed = filename.rb | sed 'N;s/\n/ \| /' | sed 's/\(^[0-9] \)/0\1/'
0 голосов
/ 02 октября 2009

Попробуйте это:

egrep -n . /dev/null file | sed -e 's/:/ | /'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...