shell脚本之sed使用----替换、变量、转义字符

news/2024/7/3 9:12:22

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的变量里使用那些特殊的需要转义的字符呢?

网上提出的一种方法是将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

 

转载于:https://www.cnblogs.com/chismi/p/10055792.html


http://www.niftyadmin.cn/n/3615966.html

相关文章

在Jenkins中将项目检出到子目录 (使用GIT)

Jenkins拉取源码是非常实用的操作,比如每天在跑自动化测试前,拉取Git远程仓库中最新的脚本至本地。那么Jenkins如何拉取Git远程仓库中指定分支至本地指定目录呢? 下面来看看具体的设置方法 Step1:Job源码管理中,选择…

使用GrowPart工具完成对LVM逻辑卷的在线热扩容

逻辑卷所在物理磁盘如果划分了分区,想要动态增加卷空间大小,有两种方式扩容逻辑卷。 方法一 新建一个分区,将新分区扩容至逻辑卷 # 思路如下: lsblk fdisk /dev/sdb n--》p--》回车--》回车--》回车--》w 创建PV,添加到VG,lv…

编程珠玑--粗略估算

粗略估算是《编程珠玑》中第七章提到的内容。 这篇文章将“粗略估算”看做是一项工程技术,是程序员必备的一项技能之一。 本人非常同意这个观点。粗略估算是一种把复杂的事情简单化的能力。我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力。如…

SpringBoot项目部署到外部Tomcat中的方法

SpringBoot项目部署到外部Tomcat中的方法 1. 特别说明 由于SpringBoot默认访问无需项目名,所以打包成war的SpringBoot项目也需要部署成不需要输入项目名的方式,否则资源无法访问,后面会给部署示例官方教程地址pom.xml调整 1.1 打包方式修改 &…

曲线拟合的线性最小二乘法

最小二乘法拟合 最小二乘法拟合解方程组方法多项式拟合 解方程组方法 栗子:最小二乘法求一个形如:​ 的经验公式。 x [19 25 31 38 44]; y [19.0 32.3 49.0 73.3 97.8]; ​ r [ones(5,1),x.^2]; ab r\y; x0 19:0.1:44; y0 ab(1) ab(2)*x0.^2; plo…

对象反序列化出现类型不匹配的情况(spring-boot-devtools)

目前在做springboot项目的shiro session redis共享功能。但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常 AuthorizationUser user (AuthorizationUser) cache.getSuper(key); 异常信息: java.lang.ClassCastException: com.ch.evaluation.a…

vuex小结

2019独角兽企业重金招聘Python工程师标准>>> store状态管理 1.认识store 每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同&…

基于Java语言编写的数据库中间件Mycat

一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。基于Java语言编写的数据库中间件 什么是MyCat MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看…