shell脚本之sed使⽤----替换、变量、转义字符
sed替换的基本语法为:
----s后⾯跟的是分隔符,原字符串可使⽤.*这种正则表达式进⾏整⾏替换
sed 's/原字符串/替换字符串/'
单引号⾥⾯,s表⽰替换,三根斜线中间是替换的样式,特殊字符需要使⽤反斜线”\”进⾏转义,但是单引号”‘”是没有办法⽤反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就⾏了,例如:
sed "s/原字符串包含'/替换字符串包含'/" //要处理的字符包含单引号
命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为⽅便,只需要紧跟s定义即可,例如换成问号”?”:
sed 's?原字符串?替换字符串?' //⾃定义分隔符为问号
可以在末尾加g替换每⼀个匹配的关键字,否则只替换每⾏的第⼀个,例如:
sed 's/原字符串/替换字符串/' //替换所有匹配关键字
上箭头”^”表⽰⾏⾸,美元”$”符号如果在引号中表⽰⾏尾,但是在引号外却表⽰末⾏(最后⼀⾏),这⾥犯⼆了,搜了半天哪个符号表⽰⾸⾏,半天才想起来,⾸⾏就是数字”1″啊.那么在⾏⾸和⾏尾添加字符串就是把⾏尾和⾏⾸替换,例如:
sed 's/^/添加的头部&/g' //在所有⾏⾸添加
sed 's/$/&添加的尾部/g' //在所有⾏末添加
sed '2s/原字符串/替换字符串/g' //替换第2⾏
sed '$s/原字符串/替换字符串/g' //替换最后⼀⾏
sed '2,5s/原字符串/替换字符串/g' //替换2到5⾏
sed '2,$s/原字符串/替换字符串/g' //替换2到最后⼀⾏
替换样式可以多个在同⼀条命令中执⾏,⽤分号”;”分隔,例如:
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' //同时执⾏两个替换规则
sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向,或者使⽤参数”i”直接在⽂件中替
换:
sed -i 's/原字符串/替换字符串/g' filename //替换⽂件中的所有匹配项
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
⾸先是Sed⾥使⽤变量的问题
⽹上有⼈总结了四种⽅案:
1. eval sed 's/$a/$b/' filename
2. sed "s/$a/$b/" filename
3. .sed 's/'$a'/'$b'/' filename
4. .sed s/$a/$b/ filename
字符串截取第几行我⽐较喜欢第⼆种,也就是:Sed后⾯的表达式⼀般⽤单引号引起来('),当需要使⽤变量时就换⽤双引号(")。
关于单双引号的区别:
单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。
双引号:shell处理命令时,要对其中的内容进⾏算术扩展。如果想让shell扩展后得到sed命令所要的格式,使⽤命令:
sed -n "/\\\\$/p"
haha,扩展后得到的结果即\\$.
因此对于语句类似:
$Comfilename="/home/evan/sandbox/Main/"
1. echo $Comfilename | sed 's#\/#\\\/#g'
2. echo $Comfilename | sed "s#\/#\\\/#g"
第⼀个的结果是:\/home\/evan\/sandbox\/Main\/
⽽第⼆个还是:/home/evan/sandbox/Main/ 因为双引号会将“\/“解释为”/“,所以sed "s#\/#\\\/#g"被Shell解释成了sed s#/#\/#g 到sed⾥执⾏时⼜把”\/“转义为”/“了,这样相当于进⾏了了两次解释,就得不到想要的结果了。
这个例⼦告诉我当没必要⽤双引号的的时候就不要⽤,要不然说不定什么时候你就会很郁闷。当然单引号效率要⽐双引号⾼也是不要滥⽤双引号的原因之⼀。
⾔归正传,如何在sed的变量⾥使⽤那些特殊的需要转义的字符呢?
⽹上提出的⼀种⽅法是将sed⾥表⽰替换⽤的s后⾯的表⽰分隔⽤的字符换成别的变量⾥没有的字符这样就相当于变量⾥没有要转义的字符了。
如:
sed –i "s# $Comfilename#/Root/#" filename.list
这是⼀个好办法。但很不幸我需要的是删除“d”不是替换“s“。当我把同样的⽅法⽤于删除时似乎没有起到作⽤:
sed –i "# $Comfilename#d" filename.list
于是只能⾃⼰⼿⼯先改写变量
$Comfilename="/home/evan/sandbox/Main/"
Tempname=` echo $Comfilename | sed 's#\/#\\\/#g'` (这⾥把反单引号执⾏的结果给临时变量,同样的⽅法可以改写其他需要转义的符号。)
sed –i "# $ Tempname #d" filename.list
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论