Использование цикла для помещения строки, хранящейся в массивах, в конкретную строку конкретного файла - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть код, который вырезает и разделяет содержимое текстового файла в разных массивах.Первое поле содержит имя файла, номер второй строки, третью строку для добавления.

Пример текста:

create_tetro.c:132://   printf("\t\t\tSol %d found !\n", sol);
float_to_int.c:23://    printf("%f -> %d\n", i, ((int)i / 1) + 0.9999);
free_all.c:19:  printf("update_pieces\n");

Код для назначения содержимого массивам:

i=0

while read line; do
{
file[$i]="$(cut -d ':' -f1 <<< $line)"
line_nb[$i]="$(cut -d ':' -f2 <<< $line)"
string[$i]="$(cut -d ':' -f3 <<< $line)"
((i++))
}
done < .gres.txt

TheВышеуказанная часть является правильной и функциональной.Теперь я хотел бы использовать массивы в цикле, чтобы добавить $string[i] в $line_nb[i] в $file[i], используя sed -i или что-то еще.Другими словами, я хочу добавить строки, содержащиеся в массиве, в некоторые файлы .c в определенные строки.Это будет вызвано правилом Makefile с именем «print debug» и автоматически заменит все отладочные printfs в соответствующих файлах в правой строке.Это не работает, но близко:

for i in {1..150}; do sed -i '' "${line_nb[$i]}i${string[$i]}" ${file[i]};done

Я проверил много ресурсов, документации, видео, вопросов, но пока ничего не помогло.

1 Ответ

0 голосов
/ 21 декабря 2018

Не знаю, зачем вам нужны массивы на этом этапе, но я предполагаю, что вам это нужно.

Обновление

Вы вставляете программный код, поэтому ваши "str "получает метасимволы, такие как обратный слеш.Я добавил строку для экранирования escape-последовательностей, но разбирать вещи, которые могут быть командами для синтаксического анализатора, в лучшем случае очень осторожно.

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

declare -i i=0
while IFS=: read -r target lno str
do file[i]="$target"
   line_nb[i]="$lno"
   str="${str//\\/\\\\}"
   string[i++]="$str"
   sed -i "$lno i\\$str" $target
done < "$1"

Вы можетехочу сделать резервную копию всех ваших целевых файлов, прежде чем вы попробуете это.;)

...