Вход:
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