Как заменить CLRF на новую строку в открытом ключе

Я никогда не использую толстые клиенты типа gnome-terminal-serverтолько для вкладок. Xtermлегкий, универсальный и сложный. Вместе с экраном это будет делать больше, чем gnome-terminal-serverотдельно или что-то еще (Хорошо, вы можете использовать это и сscreen). Но есть небольшая проблема не только для Xterm. Терминалы часто используются для подключения по ssh к удаленным машинам. Если вы запустите xtermи внутри него screen, то в этом screenвы сможете подключиться к удаленному компьютеру по ssh. На этой удаленной консоли мне также нравится, когда screenработает, но здесь есть screenв screen, и вы не можете переключить удаленный screenна ctrl-A. Вы только переключаете свой первый screen.

Вы можете открыть вторую вкладку (, не запускаяscreen)ssh на удаленный компьютер и запустить screen. С помощью Xtermя просто открываю для этого второе окно и могу переключать окна с помощью Alt-Tab, как на вкладках.

0
01.11.2019, 07:28
2 ответа

Если ваш файл представляет собой текстовый файл DOS с окончаниями строки \r\n-, вы можете легко заменить их литеральной строкой \n, используяtr:

$ tr '\r\n' '\\n' <keyfile
-----BEGIN PUBLIC KEY-----\nMIIBIjANBg...etc...\n6wIDAQAB\n-----END PUBLIC KEY-----\n

(в конце вывода нет новой строки)

Комбинация аргументов для trзаменяет каждый возврат каретки(\r)символом \(, который должен быть экранирован ), и каждую новую строку(\n)символом n.


Как указывали другие, ваша команда

sed 's/ [^PUBLIC KEY]/\\n/g'

сделать замену символов новой строки на \nне работает, отчасти потому, что [^PUBLIC KEY]просто означает «любой одиночный символ, не входящий в наборBCEIKLPUY(и символ пробела )».

Чтобы сделать это с sed, вы можете сделать что-то вроде

sed -n 's/\r$/\\/; 1{ h; d; }; H; ${ x; y/\n/n/; s/\\$/&n/; p; }' keyfile

Это предполагает, что вы используете sed, что \rявляется возвратом каретки (GNU sedделает это, но sedв OpenBSD не ).

Сценарий sedсначала заменяет возврат каретки в конце текущей строки на обратную косую черту и добавляет ее к пробелу (первая строка заменяет пробел без добавления к ней символа новой строки ). Достигнув последней строки, поменяйте местами удерживаемый пробел и замените символы новой строки символом n, а последнюю косую черту — \n.

Результатом этого будет новая строка в конце (в отличие от результата команды tr).

0
28.01.2020, 02:39

Ваше регулярное выражение не работает должным образом. Он соответствует символу пробела, за которым не следует P, Uили B... […]— это класс символов, который соответствует только одному из несколько персонажей. И поскольку Mне входит в ваш класс символов, он удаляется, как и другие отсутствующие символы в вашей строке.

С помощью GNU sedвы можете заменить все новые строки литералами \nи удалить последний литерал \nв конце строки:

PUB_KEY=$(sed -z 's/\n/\\n/g;s/\\n$//' keyfile)

Обратите внимание, что строка теперь не заканчивается новой строкой, но я думаю, это то, что вам нужно.

1
28.01.2020, 02:39

Теги

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