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이 플래그를 제거할 수 있습니다. "replace"에서 큰따옴표를 이스케이프 처리할 필요가 없습니다. 더 단순화하려면 "대체"를 사용하십시오.

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

관련 정보