Как выполнить вывод строк File2, измененных с помощью подстановок sed из File1

Я думаю, вам нужно преобразовать необработанное изображение в qcow2 с помощью qemu -img. Образ qcow2 будет выделять диск только по мере необходимости (sparse ).

Например:

$ qemu-img convert -O qcow2 myimage.raw myimage.qcow2

Затем замените образ диска в определении виртуальной машины на образ qcow2.

0
04.05.2020, 03:03
2 ответа

Я подозреваю, что это просто проблема кавычек в кавычках, которые не работают должным образом.

Подсветка синтаксиса вашего кода дает подсказку о том, что происходит. Обратите внимание, что s/host_name/$line/черный, а не красный, как остальная часть строки? Это потому, что вы фактически создали две строки с каким-то мусором, который bash не понимает посередине.

Примерно так должно работать

while read line; do
    commands=$(sed -e "s/host_name/$line/" $2)
    eval "$commands"
done < $1
0
28.04.2021, 23:16

Вы можете иметь как while read loop, так иfor loop

A foor loop, но для этого требуется mapfileакаreadarray

mapfile -t commands < file2.txt
mapfile -t hosts < file1.txt

for h in "${hosts[@]}"; do
  for c in "${commands[@]}"; do
    echo  command "$c" "$h"
  done
done

Обычный обходной путь, если ваш bash недостаточно свежий, чтобы иметьmapfile

IFS=$'\n' read -rd '' -a array < file.txt

Или

while IFS=  read -r file; do
  array+=("$file")
done < file.txt

Теперь "${array[@]}"содержит все значения/элементы.


Цикл while read.

while IFS= read -ru "$fd" h; do
  while IFS= read -r c; do
    echo command "$c" "$h"
  done < file2.txt
done {fd}< file1.txt
  • Удалите echo, если вы считаете, что вывод правильный, чтобы он действительно мог выполнять команды.
  • Предполагая, что оба файла имеют по одной записи в строке, встроенного commandдолжно быть достаточно, что означает отсутствие ;для разделения нескольких команд в строке. Другое дело, да...eval

  • $fdи {fd}являются произвольными именами и используют произвольный дескриптор файла, если ваш bash недостаточно свеж, чтобы изменить его на 3или выше, поскольку 0на 2уже занят. Необходимо использовать другой fdна тот случай, если что-то в цикле while readест/хлюпает stdinкак, например, ssh.

0
28.04.2021, 23:16

Теги

Похожие вопросы