加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sed 处理替换字符中的特殊字符

(2017-11-28 18:34:11)

今天编写shell程序时遇到了一个关于sed命令的问题。问题简化如下。

文本文件1.txt中包含字符串[:50]

 

[plain] view plain copy
  1. ~/Documents/books/linux/test$:cat 1.txt   
  2. [:50]  
愿意想将[:50]替换为[50:100],脚本如下:
[plain] view plain copy
  1. ~/Documents/books/linux/test$:cat test.sh   
  2. #!/bin/bash  
  3. oldstr="[:50]"  
  4. newstr="[50:100]"  
  5.   
  6. cat 1.txt sed -n 's/$oldstr/$newstr/p'  
运行./test.sh,结果没有输出
[plain] view plain copy
  1. ~/Documents/books/linux/test$:./test.sh   
  2. ~/Documents/books/linux/test$:  
于是,我上网查找问题原因,

 

1,如何在sed里使用变量的问题,发现原来是双引号和单引号引用的区别

单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。
双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式
下面是个简单的例子

[plain] view plain copy
  1. ~/Documents/books/linux/test$:name=chen  
  2. ~/Documents/books/linux/test$:echo '$name'    # $当作字符处理  
  3. $name  
  4. ~/Documents/books/linux/test$:echo "$name"    # $作为特殊字符处理  
  5. chen  
网上总结了四种方案

 

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中的单引号改为双引号。


[plain] view plain copy
  1. #!/bin/bash  
  2. oldstr="[:50]"  
  3. newstr="[50:100]"  
  4.   
  5. cat 1.txt sed -n "s/$oldstr/$newstr/p"  
但是输出的结果却跟预想的不一样。结果如下:
[plain] view plain copy
  1. ~/Documents/books/linux/test$:./test.sh   
  2. [[50:100]50]  


仔细一下,应该跟sed中的正则表达式有关:

正则表达式认可的特殊字符有:

. * [ ] ^ $ { } \ + ? | ( )

这些特殊字符中的一个作为文本字符,需要在特殊字符前添加反斜杠字符\ 来转义它。

得到之前的结果是因为sed中的正则表达式[:50]表示第一个匹配: , 5,0任一字符用[50:100]进行替换。字符串[:50]第一个匹配的是:,所以得到[[50:100]50].所以我将oldstr中的[]进行转义,并且在sed命令选项中加上g进行完全替换。


 

 

[html] view plain copy
  1. #!/bin/bash  
  2. oldstr="
    :50
    "  
  3. newstr="[50:100]"  
  4.   
  5. cat 1.txt sed -n "s/$oldstr/$newstr/g;p"  
则得到我想要的结果:

 

[plain] view plain copy
  1. ~/Documents/books/linux/test$:./test.sh   
  2. [50:100]  
问题解决完毕。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:git报转换错误
后一篇:ssh登录
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有