Как вставить \n в строку

Демонстрационный файл 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

Объяснение :То же, что и раньше, но переверните файл, чтобы получить желаемый результат.

-1
17.07.2020, 06:09
2 ответа

Гуру 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-----

Производит именно то, что вы хотите.

1
18.03.2021, 23:19

Если вы просто замените новые строки на \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
1
18.03.2021, 23:19

Теги

Похожие вопросы