![Sed 替换 CRLF 不起作用](https://linux22.com/image/169300/Sed%20%E6%9B%BF%E6%8D%A2%20CRLF%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
输入:
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