Вы можете использовать параметр - list-packets
, чтобы получить дамп того, что находится в файле gpg. Описание формата файла: RFC 4880 (стандарт OpenPGP).
Подпись напрямую не содержит хеша. Он содержит информацию, которая позволяет проверить как хэш, так и отправителя: существует алгоритм проверки подписи , который принимает на вход хеш-значение и открытый ключ и возвращает yes или ] № ; алгоритм возвращает да , если подпись была сделана закрытым ключом, соответствующим данному открытому ключу из сообщения с данным закрытым ключом, и возвращает нет во всех других обстоятельствах (подпись другой хеш, подпись, сделанная другим ключом, или набор байтов, которые вообще не могут быть подписью). По алгоритму DSA я считаю невозможным извлечь хэш из подписи, если у вас нет закрытого ключа.
Файл подписи содержит личность подписавшего, а также значение подписи. Для проверки подписи gpg считывает открытый ключ подписывающей стороны из вашей связки ключей, вычисляет хэш данных и применяет алгоритм проверки подписи.
Попробуйте:
cat file.txt | tr [[:upper:]] [[:lower:]] | tr '\n' ' ' | sed -E 's/[ \t]+/\n/g'
Ваш tr -d '\n'
объединяет все слова, удаляя пробелы. tr '\n' ' '
выше сохраняет расстояние.
Затем интервал необходимо преобразовать в один пробел, sed выше делает это. Преобразует несколько пробелов (или табуляции)[ \t]+
в одну новую строку \n
.
Опция Grep -o
идеальна для этого :, она печатает каждое совпадение на отдельной строке.
grep -E -o '[[:alpha:]]{2,}' file.txt
И если вы хотите это в нижнем регистре
grep -E -o '[[:alpha:]]{2,}' file.txt | tr '[:upper:]' '[:lower:]'
Обратите внимание, что регулярное выражение grep использует двойные скобки, а tr — нет :, потому что класс символов в регулярном выражении должен заключаться в скобки, а tr не использует регулярные выражения, а использует наборы символов.
Ответить на вопрос по заголовку:
command that will take a file and separate each word so its on its own line
Вы могли бы сделать:
<file tr '\n\t\r' ' '' '' ' | tr -s ' ' '\n' # needs three spaces !
Он преобразует символы новой строки, табуляции и возврата каретки в пробелы, а затем…
преобразовать любую серию(-s
)пробелов обратно в одну новую строку.
Вы можете воспользоваться командой tr и использовать ее для преобразования верхнего регистра в нижний в том же вызове.:
<file tr '[:upper:]\n\t\r' '[:lower:] ' | tr -s ' ' '\n'
Или вы можете сделать то же самое в GNU sed (с учетом того, что это загрузит весь файл в память и предполагает, что внутри файла нет байтов NUL):
<file sed -zE -e 'y/A-Z\n\t\r/a-z /;s/ +/\n/g'
Затем, чтобы ответить на вопрос в теле:
(a word is defined to be a contiguous sequence of letters, so 1 letter words don't count) and to remove all blank lines.
вы можете удалять слова с символами, отличными от a -z, односимвольные слова и пустые строки:
sed -E '/[^a-z]/d;/^.$/d;/^$/d'
Его можно свести к несколько более загадочному:
sed -E '/[^a-z]/d;/^(.|)$/d'
Все в одну строку, либо:
<file tr '[:upper:]\n\t\r' '[:lower:] ' | tr -s ' ' '\n' | sed -E '/[^a-z]/d;/^(.|)$/d'
Или:
<file sed -zE -e 'y/A-Z\n\t\r/a-z /;s/ +/\n/g' | sed -E '/[^a-z]/d;/^(.|)$/d'
Версия с комментариями (работает в GNU sed):
# Source `file` and use sed with the `zero` option (-z) and Extended Regex (ERE `-E`)
<file sed -zE -e '
# Transliterate (-y) UPPER to lower and convert control to space.
y/A-Z\n\t\r/a-z /
# Restore consecutive spaces to **one** newline.
s/ +/\n/g
# Second call to sed.
' | sed -E '
# Delete (d) lines that have nay character not in the range a-z.
/[^a-z]/d
# delete any line with one character or empty.
/^(.|)$/d
'
$ echo ' HTE ONTE NOTEH ONTEH E E O AOE ' | perl -pe '$_ =~ s/\b\w\b//g; $_ =~ s/\W*(\w+)\W*/\L$1\n/g'
hte
onte
noteh
onteh
aoe
При этом Perl используется для того, чтобы сначала удалить любые одиночные -символьные слова из ввода, а затем извлечь и -уменьшить регистр каждого оставшегося слова с удаленными не -словесными символами и с каждым словом в отдельной строке.