sed命令替换字符串
使用sed命令可以直接替换文件中的字符串,在应用中比较普遍
替换字符串的一般格式为:
sed 's/aaa/bbb/g'
其中s表示替换filename文件中每行的第一个匹配到的字符串,如果要替换前三行匹配到的字符串,可以修改成sed '3s/aaa/bbb/g',以此类推;
sed -i可以直接修改文件中的内容sed -i 's/aaa/bbb/g' filename
aaa、bbb可以修改为变量,但需要用单引号扩起来sed -i 's/'$aaa'/'$bbb'/g' filename;
同时执行两种替换规则sed -i 's/aaa/bbb/g;s/ccc/ddd/g' filename,中间用分号隔开;
如果替换到的字符串中包含和sed中一样的分隔符,那么就必须修改当前的分隔符。例如替换字符串中如果包含斜杠/,那么命令要修改为:sed -i 's#aaa#bbb#g' filename, #可以替换成其它的符号,以此类推,sed会把s后面的第一个字符作为分隔符;
sed替换变量命令在网上搜罗一下大概有四种:
1、eval sed 's/$a/$b/g' filename
这个命令在实际运用中没有使用过
2、sed "s/$a/$b/g" filename
这种方式把sed里面的单引号改为双引号,从而可以直接使用变量,这种方式使用比较普遍
3、sed 's/'$a'/'$b'/g' filename
把变量名称用单引号包裹起来,这种方式使用也较多
4、sed s/$a/$b/g filename
这个命令在实际运用中没有使用过
需要注意的是,双引号的拓展作用在使用变量时是无效的。例如在替换的字符串中如果包含斜杠"/",此时使用变量来替换就会出现问题,必须要修改sed的分隔符:
字符串aa="123abc/qqq"
sed -i "s/$aa/bb/g" filename
此时直接使用这个命令sed是会报错的,即便给字符串aa加上转义:aa="123abc\/qqq",把变量作为整体也无效:
sed -i "s/${aa}/bb/g" filename
只能修改sed中的分隔符为其它字符:
sed -i "s?$aa?bb?g" filename
这个时候就不会报错了,sed的分隔符成了?,不会与字符串中的/冲突。