입력:
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