vim和sed两种方式实现特殊字符(#和/)替换笔记

碰到一个问题需要把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私房菜》基础学习篇

发表评论

电子邮件地址不会被公开。 必填项已用*标注