Как стать автором
Обновить

Комментарии 9

Недопонял, зачем это здесь, и кому это можно понадобиться, ну да ладно.
Зачем-то ваш скрипт поправил. Мне кажется, стало немного читабельнее.

Скрытый текст
#!/bin/bash

path=./
temp=$path/temp
key_files="name.key masks.key masks2.key primary.key primary2.key header.key"
original_file="$temp/$1"

mkdir -p "$temp"
mkdir -p "$path/keys"

# CR to LF. Конвертируем файл в формат UNIX (Окончания строк LF, вместо CR)
dos2unix -n -q "$1" "$original_file"

# Записываем имена всех ключей во временный файл
grep  -E -o 'Keys\\\w+]' "$original_file" | sed -E 's/Keys\\//; s/]//' > $temp/keysname

while read key
   do
     # Записываем полное содержимое ключа в отдельный файл с его именем
     cat $original_file | sed -e '/./{H;$!d;}' -e "x;/$key]/!d" | sed -n "/$key]/!p" > $temp/$key
    
    # Разделяем ключи (name, primary, masks, header...) и записываем в отдельные файлы в папку с именем ключа 
    mkdir -p "$path/keys/$key"

    for file in $key_files;
     do 
     hex=$(cat $temp/$key | tr -d '\n' | sed -E 's/\\//g; s/ //g; s/\$//g' | grep -E -o "$file\"=hex:(\w{2},?)+?" | sed -E "s/$file\"=hex://; s/,//g" | sed -E 's/\w{2}/\\x&/g')
     echo -e -n "$hex" > "$path/keys/$key/$file"

     # LF to CR ??? 
     # sed 's/$'"/`echo \\\r`/" "$path/keys/$file" > "$path/keys/$file"
    done
done < $temp/keysname

# Очистка временных файлов
rm -rf "$temp"

exit 0


Небольшие пояснения.
  • Не нужно проверять, существует ли директория, если вам нужно её создать — mkdir -p создаст её со всеми поддиректориями и не будет ныть, если всё уже создано.
  • Не нужно и проверять, если вам её нужно удалить — rm -rf не ругается, если ему ничего не дали.
  • Для итерации по списку файлов сойдёт и просто строка, ассоциативный массив на мой взгляд излишен. Да и синтаксис у него страшнее.
  • Зачастую можно обойтись без cat, многие утилиты могут принимать на вход файлы (в этом скрипте осталась ещё пара таких мест)

Пожалуй, вместо sed можно бы использовать скрипт на python или ещё чем-нибудь более человечном.
За ликбез и поправки спасибо +1. Скрипты пишу не часто и конструкции получаются не очень красивые порой.
Глупые и ненужные проверки тянутся еще из далекого прошлого, со времен borland pascal наверное.))
sed, кстати тоже может принимать данные из файла, без cat. Забыл про это.
sed 'бла бла бла' <file
Это не имеет никакого отношения к sed. Перенаправление ввода/вывода — возможности оболочки. Sed будет просто использовать stdin, не увидев никакой разницы между < и cat (хотя она, вообще‐то, есть: в случае с cat stdin будет подключен к pipe, в который cat закачивает данные, а в случае с < stdin будет связан с файлом: разница не только в наличии лишних действий со стороны cat, но и в том, что файл, к примеру, поддерживает fseek/ftell, а pipe — нет).
Полезно, но в вышеуказанном примере абсолютно «монопинисуально» — т.е. без разницы. )))
Я не старался сделать чистый и оптимальный код с оптимальным быстродействием и «защитой от дурака». Ну да, может и некрасиво и не очень быстро, но работает. Работает, кстати, медленно — на моем i3 где то около секунды парсил 15 ключей.
Я тоже обычно пишу cat file | sed, потому что так удобнее менять sed на что‐то ещё. Но вообще о том, как нужно писать — sed command file (только здесь sed будет открывать файл сам, а не пользоваться stdin), sed command <file, cat file | sed command или даже <file | sed command (zsh) — периодически разгораются жаркие споры. В том числе видел такое и на habrahabr.ru.
Честно говоря, никогда не лез в такие тонкости. Возможно впоследствии, когда нужна будет мегасупероптимизация по универсальности и быстродействию — вкурю и это. В любом случае, спасибо за ликбез.
Если нужна мегасупероптимизация, то проще переписать с использованием чего‐то вроде Python+PyPy. А такие споры — погоня, как правило, за долями процентов (если только вы не догадались действительно написать <file | sed command с достаточно большим файлом — zsh почему‐то на порядок медленнее cat в данном вопросе).
Если мне память не изменяет, то можно делать все самим КриптоПро. Копируем закрытый ключ с реестра на флеху через панель управления. И получаем эти файлы на флехе.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории