sed 字符串替换

  

在文本文件离进行替换

在很多 shell 脚本的工作都从通过 grep 或 egrep 去除所需的文本开始。正则表达式查找的最初结果,往往就成了要拿来作进一步处理的“原始数据”。通常,文本替换至少需要做一件事,就是讲一些字以另一些字取代,或者删除匹配行的某个部分。

执行文本替换的正确程序应该是 sed----流编辑器。
sed 的设计就是用来批处理而不是交互的方式编辑文件。当药做好几个变化的时候,不管是对一个还是对数个文件,比较简单的方式就是将这些变更部分写到一个编辑的脚本里,再将此脚本应用到所有必须修改的文件,sed 的存在目的就在这里。

 

1. sed替换的基本语法为:

sed 's/原字符串/替换字符串/'

单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义。

2. 单引号” ‘ ’”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下:

# 要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/"

3. 命令中的三根斜线分隔符可以换成别的符号,有时候替换目录字符串的时候有较多斜线,这个时候换成其它的分割符是较为方便,只需要紧跟s定义即可。

# 将分隔符换成问号”?”:
sed 's?原字符串?替换字符串?'


4. 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:

# 替换所有匹配关键字
sed 's/原字符串/替换字符串/g'

5. 一些特殊字符的使用

  ”^”表示行首

  ”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)
  

复制代码
# 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g'      #在所有行首添加 sed 's/$/&添加的尾部/g'      #在所有行末添加 sed '2s/原字符串/替换字符串/g'  #替换第2行 sed '$s/原字符串/替换字符串/g' #替换最后一行 sed '2,5s/原字符串/替换字符串/g' #替换2到5行 sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行
复制代码

 

6.批量替换字符串

sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir

 

7. sed处理过的输出是直接输出到屏幕上的,使用参数”i”直接在文件中替换。

# 替换文件中的所有匹配项
sed -i 's/原字符串/替换字符串/g' filename

8. 多个替换可以在同一条命令中执行,用分号”;”分隔,其格式为:

# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'

 

mac环境使用sed -i 修改文件出错的解决方法

  

mac下执行

sed -i "s+$old_dir+$new_dir+g" /data/study/centos/t.txt

报错:

  sed: 1: "/data/study/centos/ ...": bad flag in substitute command: 'a'

原因:

  man sed

    

      -i extension

             Edit files in-place, saving backups with the specified extension.  If a zero-

             length extension is given, no backup will be saved.  It is not recommended to

             give a zero-length extension when in-place editing files, as you risk corrup-

             tion or partial content in situations where disk space is exhausted, etc.

 

    就是sed -i需要带一个字符串作为备份源文件的文件名称后缀,如果这个字符串长度为0,则不备份。 

执行

  sed -i "_back" "s+$old_dir+$new_dir+g" /data/study/centos/t.txt

  这样就会生成一个t.txt_back的文件

 

 

 

posted @ 2018-09-03 10:25  liqinggai  阅读(535)  评论(0)    收藏  举报