在shell中使用sed

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/frank_jb/article/details/82023742

 如果有一个abc.txt文件,内容如下:

$cat abc.txt
aaa
bbb
BATBUSINESSTYPE, INSIDEID--) ONLINE;
INSIDEID--) ONLINE
ccc
ddd
eee
fff

如果要删除ddd,那么脚本可以这样写:

sed -i '/ddd/d' abc.txt   //-i,将修改写会原文件

如果删除的是一个变量的值,假如变量是var,应该写成:

sed -i '/'"$var"'/d' abc.txt

至于grep -v aaa abc.txt这个方法,是无法将修改的结果写入abc.txt中去的。

删除:d命令

$ sed '2d' example-----删除example文件的第二行。
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
$ sed '$d' example-----删除example文件的最后一行。
$ sed '/test/'d example-----删除example文件所有包含test的行。

在看看以前我常写的sed 's/|/,/g' aaa.txt>bbb.txt 这个的意思就是把aaa.txt文件中所有字符串|都换成,这是怎么表示的呢?s代表字符串,g表示行内全面替换。 

替换:s命令

扫描二维码关注公众号,回复: 3113697 查看本文章

$ sed 's/test/mytest/g' example
-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n 's/^test/mytest/p' example
-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
$ sed 's/^192.168.0.1/&localhost/' example
-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
$ sed -n 's/able/\1rs/p' example
-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed 's#10#100#g' example
-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
cat init.ora | grep -v  ^#|grep –v ^*  > initprod.ora

实例1:在test文件中找到System.Block这一行,并将这一行的YES改为NO,然后再写入到原文件

sed -i '/'System.Block='/s/YES/NO/g' test //-i,将修改写回原文件;s字符串;g该行所有符合条件的字符串均被替换

实例2:将$(BRCM_VERSION)替换成"\"$(BRCM_VERSION)\""

$cat test
adfd
System.Block="yes"
CFLAGS += -DBRCM_VERSION=$(BRCM_VERSION) -DBRCM_RELEASE=$(BRCM_RELEASE) -DBRCM_EXTRAVERSION="\"$(BRCM_EXTRAVERSION)\""

$ sed -i '/'DBRCM_VERSION'/s/$(BRCM_VERSION)/"\x5c\"$(BRCM_VERSION)\x5c\""/g' test    

难点在于"\"符号的输出,特别是反斜杠\的输出,这里通过\的十六进制的ascii进行输出\x5c,其中5c在ascii中代表\

$ cat test
adfd
System.Block="yes"
CFLAGS += -DBRCM_VERSION="\"$(BRCM_VERSION)\"" -DBRCM_RELEASE=$(BRCM_RELEASE) -DBRCM_EXTRAVERSION="\"$(BRCM_EXTRAVERSION)\""

实例3:

$ cat 11371_mobile_20110425.csv
20110425,北京,北京,13661189983
20110425,北京,北京,15810705979
WAPSJBBI_101>
WAPSJBBI_101>spooloff;
$ sed -i '/WAPSJBBI_101>/d'11371_mobile_20110425.csv
$ cat 11371_mobile_20110425.csv          
20110425,北京,北京,13661189983
20110425,北京,北京,15810705979

答案是这样的:从结果上看怎么就2行都删了呢?

sed 后面那个/d是删除的作用,写成sed '/WAPSJBBI_101>/d' 11371_mobile_20110425.csv其实就是在文件11371_mobile_20110425.csv里找到跟 “WAPSJBBI_101>”匹配的行,然后删掉。因为原文中含有“WAPSJBBI_101>”的行是2个,因此就2个一口气都删除了。

实例4:在sed中使用变量,将一个字符串换成一个十六进制形式的变量

var=$1      //获取sh脚本的第一个参数
SW_REV=${var:0-4:4}    //截取参数中的后四个字符
key="info->appVer ="   
sed -i "/$key/s/EponDevFirmwareVer/0x$SW_REV/g" $Firmware_Info  

sed -i "/$key/s/EponDevFirmwareVer/0x$SW_REV/g" $Firmware_Info

可以看到例2中也有用到美元符号,但为何这里就变成了变量。那是因为本例中sed命令中我们使用的是"",而不是''。在shell脚本中双引号括起来的字符中,$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)这几个字符仍是特殊字符并保留其特殊功能外,其余字符则作为普通字符对待。所以本例中$key就变成了变量,而不再是常量。

猜你喜欢

转载自blog.csdn.net/frank_jb/article/details/82023742