輸入:
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
if 存在的情況:
sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file
由於行首和行尾在一行中只存在一次,因此g
可以刪除該標誌。無需轉義“替換”中的雙引號。使用「交替」進一步簡化:
sed -e 's/^\|\r*$/"/g' -e 's/+/","/g' file