shell脚本经常会使用替换操作,sed用处很广,下列集中对一些使用场景做出总结:
1. 普通操作可以使用冒号(:)井号(#)正斜杠(/)来作为分隔符
eg: sed -i 's#abc#def#g' geng.file ---将文件geng中的abc替换成def
cat geng.file | sed 's/abc/def/g' ---打印文件geng,并将其中的abc替换成def
2. 对于变量做替换
sed 若是单引号括起来的,变量上得再额外加个单引号才能引用生效;
若是双引号括起来的,可直接引用生效
eg: pa='127.0.0.1/32'; field='ip_allow=123';
echo $field | sed 's#^ip_allow=.*#ip_allow=${pa}#g'
结果:ip_allow=${pa} --变量替换未生效
echo $field | sed 's#^ip_allow=.*#ip_allow='${pa}'#g'
结果:ip_allow=127.0.0.1/32
echo $field | sed "s#^ip_allow=.*#ip_allow=${pa}#g"
结果:ip_allow=127.0.0.1/32
3. 特殊字符替换,反斜杠、正斜杠、双引号、$美元符
单个转义:多加个反斜杠做转义即可:反斜杠(\)、正斜杠(/)、双引号(")
单转多个:参考如下列表
实现目标方法能否用单引号还是双引号括起来单引号双引号为什么反斜杠()替换成两个反斜杠(\)sed -i 's#\#\\#g' file
或sed -i 's:\:\\:g' file
√×反斜杠用双引号括起来会报错反斜杠()替换成正斜杠(/)sed -i 's#\#/#g' file√×反斜杠用双引号括起来会报错双引号(")替换成两个双引号("")sed -i 's#"#""#g' file
sed -i "s#"#""#g" file
√√单引号(')替换成两个单引号('')sed -i "s#'#''#g" file×√不能用单引号括起来,分不清了美元符($)替换成$sed -i 's:$:\$:g' file√×不能用双引号,否则会认为是$(正则匹配结尾位置)行的结果追加字符呢
正斜杠(/)可以用单引号、双引号括起来进行替换;但是涉及到反斜杠()不行,不能用双引号,只能用单引号括起来替换,不然报错:sed: -e expression #1,char 8: unterminated `s' command
4. curl时用的变量,sed转化
curl -H 'Content-Type: application/json' -X POST -d 参数
(参数中涉及到特殊字符都得转义,而且要多转一层,即$得转成\$,才能原封不动的供后续使用)
#值替换单引号、反斜杠、双引号 curl的时候用,多一层转义,所以要用\
sed -i "s#'#''#g" ${file} ---单引号要转成两个单引号
sed -i 's#\#\\\\#g' ${file} ---反斜杠
sed -i "s:":\\":g" ${file} ---双引号
sed -i 's:$:\\$:g' ${file} ---美元符
curl引用参数的这种形式有两种写法:
1.直接引用单个参数变量
curl -H 'Content-Type: application/json' -X POST -d '{"type":"0","name":" ' ${pa_name} ' "}'
这种需要对变量额外加上一个单引号,才能引用生效!
2.整个参数变量作为一个整体(推荐)
param="{"type":"0", "name":"${pa_name}"}"curl -H 'Content-Type: application/json' -X POST -d "${param}"