问题
(1)Windows系统里,文件每行结尾是'<回车><换行>', '\r\n'
(2)Mac系统里, 文件每行结尾是'<回车>',即'\r'
(3)Unix系统里, 文件每行结尾是'<换行>',即'\n'
所以,用'\n'作为作为换行符的文件,用Windows的记事本打开时 会没有换行;
而用'\r\n'作为换行符的文件(windows文件),用Linux或mac的vim打开时 会将\r显示成^M。
echo "a,b,c,d"
在Mac或Linux系统下,以上结果皆为
a,b,c,d
现用sed,将","替换为换行, Linux系统下执行
echo "a,b,c,d" |sed 's/,/\n/g'
,
结果为:
相同命令,在Mac下执行结果则为:
解决
通过安装gsed来解决,
brew install gnu-sed
然后使用gsed,
在bash_profile中加一条alias,用gsed替换掉sed
实战一下
sed -i 's#老的路径#新的路径#g' 目标文件地址
在某大厂服务器,从虚拟机向容器迁移过程中,需要改写配置文件中日志和ip库文件的位置。
例如,需将原文件中log_path由 /home/google/log/service/qa/
改为/home/appops/logs/service/qa/
执行 sed -i 's#/home/google/log#/home/microsoft/logs#g' config.yml
(一般在Makefile里添加)
又例如,需要将
city1: /中国/浙江/杭州/余杭/仓前.db city2: /中国/浙江/杭州/余杭/闲林.txt city3: /中国/浙江/杭州/余杭/中泰.md
改为
city1: /中国/余杭/仓前.db city2: /中国/余杭/闲林.txt city3: /中国/余杭/中泰.md
可以执行 sed -i 's#/中国/浙江/杭州#/中国#g' config.yml
再例如,需要将
city1: /中国/浙江/杭州/余杭/街道/仓前.db city2: /中国/江苏/苏州/虎丘/街道/横塘.txt city3: /中国/山东/滨州/邹平/街道/黛溪.md
改为
city1: /中国/华东/街道/仓前.db city2: /中国/华东/街道/横塘.txt city3: /中国/华东/街道/黛溪.md
当然可以
sed -i 's#/中国/浙江/杭州/余杭/仓前.db#/中国/华东/余杭/仓前.db#g' config.yml sed -i 's#/中国/江苏/苏州/虎丘/横塘.txt#/中国/华东/虎丘/横塘.txt#g' config.yml sed -i 's#/中国/山东/滨州/邹平/黛溪.md#/中国/华东/邹平/黛溪.md#g' config.yml
但更好的办法,是使用通配符
sed -i 's#/中国/.*街道#/中国/华东/街道#g' config.yml
其中
.
表示任何单个字符*
表示某个字符出现了0次或多次
's#/中国/.*街道#/中国/华东/街道#g' 也就是 把'中国/xxxxxx任意多个字符xxxxx街道',替换为'中国/华东/街道'
更多可参考 coolshell-SED 简明教程