碰到一个问题需要把php.ini文件中#ROOT_PATH#全部替换为/home/work
cat php.ini include_path = ".:#ROOT_PATH#/php/lib/php" extension_dir="#ROOT_PATH#/php/ext"
首先想到的是用vim中的字符替换,操作起来有些无从下手。就用sed处理了两次
sed -i 's/#ROOT_PATH#/salmonl/g' php.ini sed -i 's#salmonl#/home/work/g' php.ini
认为一条命令就应该能搞定,事后测试了下,用vim和sed其实都可以
一、vim替换
0、用vim打开文件
vim php.ini
1、用\转译
:1,$s/#root_path#/\/home\/work/g
2、用*来分隔
:1,$s*#ROOT_PATH#*/home/work*g
二、sed替换
0、用\转译
sed -i 's/#ROOT_PATH#/\/home\/work/g' php.ini
1、用*来分隔
sed -i 's*#ROOT_PATH#*/home/work*g' php.ini
2、如果是MAC OS下,sed -i后面需要多一个空参数, 不然执行报错sed: 1: “php.ini”: extra characters at the end of p command
sed -i '' 's*#ROOT_PATH#*/home/work*g' php.ini
三、总结
0、vim替换当前行
:s/word1/word2/g
1、vim替换指定行(n1,n2)之间的字符
:n1,n2s/word1/word2/g
2、vim替换第一行到最后一行之间的字符
:1,$s/word1/word2/g
3、vim和sed的替换模式基本一致, s后面跟的就是间隔符,一般都是/, 替换字符串中含有/的时候我们一般用#, 其实可以是任何字符,放在s后面就可以做为间隔符。【遇到#和/同时出现不要大惊小怪了】
4、替换文件路径的时候,建议用其他字符分隔,而不是用转译符\,转译符比较凌乱
四、思考
一开始用两次sed替换还有些小得意。后来想应该可以一次替换,才发现可以用#分隔,在进一步整理问题在发现s后面跟啥都是分隔符。
你说知道了这个有啥意义,其实没啥很大的意义,但是你有没有突然觉得这个软件设计很好玩,你有没有突然觉得这个世界好玩了一点。不管是软件世界,还是物理世界,都有这么多好玩的细节,所以,永远保持好奇心,去探索,去发现。
希望你永远像个孩子,笑靥如花,与君共勉。
参考:
《鸟哥Linux私房菜》基础学习篇