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表達式以消除\rif 存在的情況:

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

由於行首和行尾在一行中只存在一次,因此g可以刪除該標誌。無需轉義“替換”中的雙引號。使用「交替」進一步簡化:

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

相關內容