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}"

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐