Bash脚本行末添加双引号失效:内容出现在行首替换首字符
解决sed添加引号跑到行首的问题
嘿,我之前也踩过这个坑!你遇到的情况,十有八九是**你的文件带着Windows风格的换行符(CRLF,也就是\r\n)**在搞怪。
问题原因
Unix/Linux系统里的换行是单个\n,但Windows下是\r\n(\r是回车符,会让光标跳回行首)。当你用sed 's/$/"/g'时,$在sed里匹配的是\n之前的位置——也就是\r所在的位置。替换后,行尾变成了"\n,但原来的\r还在。当你查看输出时,\r会把光标拉回行首,后面的字符就把第一个字符给覆盖了,所以才会出现a silly example变成"illy example"的诡异情况。
解决办法
给你几个实用的方案:
先转成Unix换行符再处理
如果系统里有dos2unix工具,直接转格式再加引号:dos2unix your_file.txt sed 's/$/"/g' your_file.txt用sed一步搞定(无需转换文件)
直接在sed命令里先处理掉\r,再添加引号:sed 's/\r$//; s/$/"/g' your_file.txt或者更简洁的写法,直接匹配可选的
\r再替换:sed -e 's/\r\?$/"/' your_file.txt
试一下上面的命令,应该就能看到引号乖乖出现在行尾啦!
内容的提问来源于stack exchange,提问作者Never Mind
相关产品推荐
相关产品推荐

