stuff.txt
содержит:one
two
three
one
two
four
five
Удаление повторяющихся строк из файла, если вы не возражаете против сортировки строк
$ sort -u stuff.txt
five
four
one
three
two
Объяснение :Флаг u, отправленный для сортировки, говорит о сортировке строк файла и принудительной уникальности.
Удаление повторяющихся строк из файла, сохранение исходного порядка, сохранение первой:
$ cat -n stuff.txt | sort -uk2 | sort -nk1 | cut -f2-
one
two
three
four
five
Объяснение :Флаг n, переданный в команду cat, добавляет номера строк слева от каждой строки плюс пробел, затем первая команда сортировки говорит, что сортировать по уникальности, и только после первого слова, вторая команда сортировки говорит, что используйте номера строк мы сохранили на шаге 1, чтобы прибегнуть к исходному порядку, наконец, обрезав первое слово.
Удалить повторяющиеся строки из файла, сохранить порядок, оставить последним.
tac stuff.txt > stuff2.txt; cat -n stuff2.txt | sort -uk2 | sort -nk1 | cut -f2- > stuff3.txt; tac stuff3.txt > stuff4.txt; cat stuff4.txt
three
one
two
four
five
Объяснение :То же, что и раньше, но переверните файл, чтобы получить желаемый результат.
Гуру Shell сделают это проще, но вот мое мнение:
openssl genrsa 2>/dev/null | awk '{ if ($0~"BEGIN RSA") {ORS="\\n"; print} else {if ($0~"END RSA") {print "\\n"; print} else {ORS=""; print}}}'
-----BEGIN RSA PRIVATE KEY-----
MIIE....skipped
-----END RSA PRIVATE KEY-----
Производит именно то, что вы хотите.
Если вы просто замените новые строки на \n
, результат будет неоднозначным, потому что \n
мог быть либо новой строкой, либо \n
в оригинале. В данном конкретном случае это не проблема, потому что ввод не будет содержать \n
, но это будет проблемой во многих других случаях, включая некоторые форматы PEM, которые могут содержать комментарии, где разрешено \n
.
Обычный способ передать данные через транспортный механизм (в вашем случае, поместив их в контейнер Docker ), состоит в том, чтобы закодировать их как Base64. Кодировка Base64 включает только буквы ASCII (, прописные и строчные буквы ), цифры и три знака препинания +/=
. Пробел не имеет значения. Для кодирования без новой строки:
private_key="$(openssl genrsa)"
export encoded_private_key="$(printf '%s\n' "$private_key" | base64 | tr -d '\n')"
Для декодирования:
private_key=$(echo "$encoded_private_key" | base64 -d)
или
echo "$encoded_private_key" | base64 -d >private_key.pem