Учитывая sub.txt
подобное:
$ cat sub.txt
A -> Y
B -> V
C -> Q
D -> K
E -> L
F -> O
G -> P
H -> W
I -> X
J -> Z
Вы можете перебирать его в цикле оболочки, читая каждый из трех элементов в каждой строке в переменную:
while IFS=' ' read -r from ignore to; do... ; done < sub.txt
В этом цикле while
$from
будет исходным символом, а $to
будет символом, которым вы хотите его заменить. $ignore
посередине — это просто держатель для ->
.
Предполагается, что пробел и перевод строки(' '
и\n
)отсутствуют в списке символов, которые вы хотите транслитерировать.
Имея это в виду, вы можете использовать tr
, чтобы внести изменения и перенаправить вывод в новый файл:
while IFS=' ' read -r from discard to; do
printf '%s\n' "$string" | tr "$from" "$to" > changed."$from".txt
done < sub.txt
Обратите внимание, что некоторые реализации tr
завершатся ошибкой, если $from
или $to
равно [
или если они представляют собой многобайтовые -символы. Вышеприведенное также предполагает, что $from
не является /
.
Если string="ABCDEFGHIJ"
, приведенная выше команда создаст эти файлы:
$ ls changed*
changed.A.txt changed.D.txt changed.G.txt changed.J.txt
changed.B.txt changed.E.txt changed.H.txt
changed.C.txt changed.F.txt changed.I.txt
Со следующим содержанием:
$ for f in changed.*; do printf '%s\n' "=== $f ==="; cat "$f"; done
=== changed.A.txt ===
YBCDEFGHIJ
=== changed.B.txt ===
AVCDEFGHIJ
=== changed.C.txt ===
ABQDEFGHIJ
=== changed.D.txt ===
ABCKEFGHIJ
=== changed.E.txt ===
ABCDLFGHIJ
=== changed.F.txt ===
ABCDEOGHIJ
=== changed.G.txt ===
ABCDEFPHIJ
=== changed.H.txt ===
ABCDEFGWIJ
=== changed.I.txt ===
ABCDEFGHXJ
=== changed.J.txt ===
ABCDEFGHIZ
Это меняет каждый символ отдельно. Если вместо этого вы хотите сделать это постепенно, так что в 1-м файле будет изменен только 1-й символ, а во втором файле будут изменены как 1-й, так и 2-й символы, вы можете сделать:
tmpFile=$(mktemp)
printf '%s\n' "$string" > "$tmpFile"
while IFS=' ' read -r from ignore to; do
tr "$from" "$to" < "$tmpFile" > changed."$from".txt
cp changed."$from".txt "$tmpFile"
done < sub.txt
Это создаст следующие файлы:
$ for f in changed.*; do printf '%s\n' "=== $f ==="; cat "$f"; done
=== changed.A.txt ===
YBCDEFGHIJ
=== changed.B.txt ===
YVCDEFGHIJ
=== changed.C.txt ===
YVQDEFGHIJ
=== changed.D.txt ===
YVQKEFGHIJ
=== changed.E.txt ===
YVQKLFGHIJ
=== changed.F.txt ===
YVQKLOGHIJ
=== changed.G.txt ===
YVQKLOPHIJ
=== changed.H.txt ===
YVQKLOPWIJ
=== changed.I.txt ===
YVQKLOPWXJ
=== changed.J.txt ===
YVQKLOPWXZ
Я не уверен в загрузке systemd -, но grub работает с любым именем. Именование /
lv root
— это просто «лучшая практика», чтобы было понятно, что содержит lv. У меня есть система с root lv с именем 00
и swap lv 01
, и она отлично работает.
$ cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.8.6-301.fc33.x86_64 root=/dev/mapper/fedora-00 ro resume=/dev/mapper/fedora-01 rd.lvm.lv=fedora/00 rd.lvm.lv=fedora/01 rhgb quiet
Возможно, загрузчик systemd -перепутан, потому что в имени есть тире. Тире обычно используется как разделитель между vg и lv name, но это всего лишь догадка.
У вас может быть несколько систем в одной vg, но будут проблемы с загрузкой--/boot
нельзя разместить на lv, но возможно с общим/boot/efi
(Я не уверен, я я не очень хорошо знаком с загрузкой в системах EFI ). Но имена lv должны быть проблемой в этой настройке.
Раздел /boot не может быть устройством LVM, потому что при загрузке система сначала ищет /boot/vmlinuz, и в это время lvm не может быть распознан, потому что в это время не загружен модуль для lvm. Итак, раздел /boot не может быть разделом lvm.
Однако это можно сделать, но не рекомендуется, поскольку это описано в ссылке, которую я дал в комментарии.
Я никогда этого не пробовал, но вы можете прочитать:ЗАГРУЗКА LINUX ИЗ ТОМА LVM
Grub2 поддерживает загрузку на lvm.
Имя группы томов не имеет значения.
Все, что вам нужно сделать, это создать физический том, группу томов и логические тома. Неважно, как будет называться группа томов, это может быть root -vg или centos -vg, rhel -vg.
См. этот учебник, чтобы узнать:LFCS :Как управлять и создавать LVM с помощью команд vgcreate, lvcreate и lvextend
Я не знаю, могут ли многие логические тома быть загрузочными. Я полагаю, что нет. но нет знаний, чтобы ответить на этот вопрос.