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