Замена Sed на CRLF не работает

Замена Sed на CRLF не работает

Вход:

bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user

Желаемый результат:

"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user"

Команда:

echo "bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user" | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g'

Это работает нормально, и я получаю желаемый вывод, где терминатор строки — LF. Как только я редактирую файл в Windows и сохраняю его, терминатор строки LF заменяется на CRLF. И последнее выражение sed, где я заменяю конец строки на, $дает "сбой и дает неожиданный результат. Неожиданный результат:

"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user

Посмотрите на отсутствующее "в конце.

Пожалуйста, если есть эксперты по sed, которые могут прийти мне на помощь :).

решение1

Цитата на самом деле есть, но она заменила исходную цитату при выводе на экран:

$ printf '%s\r\n' 'foo' | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g' | od --format c
0000000   "   f   o   o  \r   "  \n
0000007

\r/CR/возврат каретки перемещает позицию виртуального курсора, используемого для вывода текста, в начало строки, поэтому в конечном итоге "перезаписывается (только в терминале) первая кавычка.

Возможно, вам захочется сначала отправить входные данные dos2unix, если вы не готовы добавлять sedвыражения для обработки \r.

решение2

Вы можете уточнить sedвыражение, исключив , \rесли он там есть:

sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file

Поскольку начало строки и конец строки встречаются только один раз в строке, флаг gможно опустить. Не нужно экранировать двойные кавычки в "replacement". Используйте "alternation" для дальнейшего упрощения:

sed -e 's/^\|\r*$/"/g' -e 's/+/","/g' file

Связанный контент