CRLF에서 Sed 교체가 작동하지 않습니다.

CRLF에서 Sed 교체가 작동하지 않습니다.

입력:

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를 삭제할 수 있습니다. "교체"에서 큰따옴표를 이스케이프 처리할 필요가 없습니다. 더욱 단순화하려면 "교체"를 사용하세요.

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

관련 정보