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

相关内容