Предлагаю купить третий диск /dev/sdc
...
Сделайте на нем точно такую же таблицу разделов, что и /dev/sda
и установите grub2
, затем отправьте данные на свой новый /dev/sdc/
диск, посмотрите, как система отреагирует на grub2
и если все в порядке, то у вас будет новая «аварийная система» и диск «восстановления данных».
Самая большая проблема, которую я могу заметить с вашим подходом, это:
(compressing something, omitting something else, adding extra backups etc, etc)
Вы не можете рассчитывать на полностью работоспособную систему, если есть какое-то упущение. А это может быть опаснее, чем возлагать все свои надежды на диск для «восстановления данных».
Я считаю, что это самый быстрый способ решить вашу проблему, поскольку вы сказали, что это было вашей самой большой проблемой.
Использование paste
, grep
иsed
:
paste -d ' '\
<(grep -v '"' file)\
<(grep -v '\.xml' file | sed 's/^[[:blank:]]*//;s/id=.*//')
Первый grep
получает все строки без двойных кавычек. Это пустые строки, строки, содержащие идентификаторы и имена файлов XML. Второй grep
получает все строки, не содержащие имена файлов XML. Начальные символы пробела/табуляции и строки, начинающиеся с id=
, удаляются. Оба результата объединены с paste
с использованием пробела в качестве разделителя.
С теми же предостережениями, которые упоминались в других сообщениях, мы можем сделать это, найдя фрагменты одинакового размера в абзаце после печати и удалив первый фрагмент строки из текущего абзаца.
Фрагменты одинакового размера находятся с помощью регулярных выражений, когда количество новых строк совпадает в двух фрагментах.
$ perl -l -00 -ne '
($line, $str) = (qr/.*\n/, q/.*\n/);
s/$/\n/;s/($line)//;printf $1;
while (
/^
($line)($line*)
(?{ $n = $2 =~ tr|\n|\n| })
(??{ $str. ($str x $n) })
$
/x
) {
s/($line)((?:$line){$n})($line)/$2/x;
print "$1\n$3" =~ tr/\n//dr;
}
printf "\n";
' file
Результаты:
id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml "Fruits/Mango/#Common"
XYZ_2 ABC.xml "Fruits/Mango/#Bizzare"
XYZ_3 ABC.xml "Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml "Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml "Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml "Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml "Fruits/Mango/#Common"
XYZ_7 LDL.xml "Fruits/Mango/#Common"
XYZ_8 LDL.xml "VEG/Mango/#NOT"
XYZ_9 LDL.xml "Fruits/Mango/#Common"
XYZ_10 LDL.xml "Fruits/Mango/#NOT"
XYZ_11 LDL.xml "Fruits/Mango/#Common"
Метод, использующий чистые манипуляции с массивами:
$ perl -F'\n' -l -00 -nae '
print $\, shift @F;
push @A, shift @F while @F > @A;
print shift @A, $_ for @F;
' file
-l will make print attach newlines.
-00 is the paragraph mode
-n reads file a record at a time.
-F splits the current record (= paragraph in our case)
around newlines and stores them in
zero indexed array @F.
При условии, что всегда имеется ровно одна строка заголовка (id/name/type )для каждой записи, а тело записи состоит из равного количества строк XYZ _n LDL.xml и категории (фруктов. /veg )строки одну за другой, вы можете использовать GNU awk(gawk
)в режиме абзаца с Getline/Variable/Coprocess для связи с pr
командой разбивки на две колонки -:
BEGIN {
RS = ""; FS = "\n";
cmd = "pr -T -s -2"
}
{
print $1;
for(i=2;i<=NF;i++)
print $i |& cmd;
close(cmd,"to");
while((cmd |& getline line) > 0)
print line;
close(cmd);
print ""
}
' file
id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml "Fruits/Mango/#Common"
XYZ_2 ABC.xml "Fruits/Mango/#Bizzare"
XYZ_3 ABC.xml "Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml "Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml "Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml "Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml "Fruits/Mango/#Common"
XYZ_7 LDL.xml "Fruits/Mango/#Common"
XYZ_8 LDL.xml "VEG/Mango/#NOT"
XYZ_9 LDL.xml "Fruits/Mango/#Common"
XYZ_10 LDL.xml "Fruits/Mango/#NOT"
XYZ_11 LDL.xml "Fruits/Mango/#Common"
Перл:
perl -00 -F'\n' -anE '
$n = ($#F + 1)/2;
say $F[0];
say $F[$_], $F[$_+$n] for (1..$n);
say "";
' raw
-00
разбивает файл на абзацы -F'\n'
использует новую строку в качестве разделителя полей -a
"авторазбивает" запись на поля, хранящиеся в массиве @F -n
перебирает записи в файле id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml "Fruits/Mango/#Common"
XYZ_2 ABC.xml "Fruits/Mango/#Bizzare"
XYZ_3 ABC.xml "Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml "Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml "Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml "Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml "Fruits/Mango/#Common"
XYZ_7 LDL.xml "Fruits/Mango/#Common"
XYZ_8 LDL.xml "VEG/Mango/#NOT"
XYZ_9 LDL.xml "Fruits/Mango/#Common"
XYZ_10 LDL.xml "Fruits/Mango/#NOT"
XYZ_11 LDL.xml "Fruits/Mango/#Common"