zoukankan      html  css  js  c++  java
  • sed替换命令

    sed替换命令

    语法为:

    sed ‘ [ address-range | pattern-range ] s/original-string/replacement-string/[substitute-flags] ’input-file

    l address-range或pattern-range(即地址范围和模式范围)是可选的,如果没有指定,那么sed将在所有行上进行替换

    l s即执行替换命令substitute

    l original-string是被sed搜索然后被替换的字符串,它可以是一个正则表达式

    l replacement-sting替换后的字符串

    l substitute-flags是可选的,下面会具体解释

    下面列举一些示例

    用Directory替换所有行中的Manager

    [root@sishen ~]# sed 's/Manager/Director/' employee.txt

    101,John Doe,CEO

    102,Jason Smith,IT Director

    103,Raj Reddy,Sysadmin

    104,Anand Ram,Developer

    105,Jane Miller,Sales Director

    只把包含Sales的行中的Manager替换为Director

    [root@sishen ~]# sed '/Sales/s/Manager/Director/' employee.txt

    101,John Doe,CEO

    102,Jason Smith,IT Manager

    103,Raj Reddy,Sysadmin

    104,Anand Ram,Developer

    105,Jane Miller,Sales Director

    全局标志 g

    g代表全局(global)默认情况下,sed会替换每行中第一次出现的original-string,如果你要替换每行中出现的所有original-string,就需要用g

    示例 用大写A替换第一次出现的小写字母a

    [root@sishen ~]# sed 's/a/A/' employee.txt

    101,John Doe,CEO

    102,JAson Smith,IT Manager

    103,RAj Reddy,Sysadmin

    104,AnAnd Ram,Developer

    105,JAne Miller,Sales Manager

    把所有小写字母a替换为大写字母A

    [root@sishen ~]# sed 's/a/A/g' employee.txt

    101,John Doe,CEO

    102,JAson Smith,IT MAnAger

    103,RAj Reddy,SysAdmin

    104,AnAnd RAm,Developer

    105,JAne Miller,SAles ManAger

    注意上述例子会在所有行上进行替换,因为没有指定地址范围

    数字标志(1,2,3,·····)

    使用数字可以指定original-string出现的次序,只有第n次出现的original-string才会触发替换,每行数字从1开始,最大为512

    比如/11会替换每行中第11次出现的original-string

    把第二次出现的小写字母a替换为大写字母A

    [root@sishen ~]# sed 's/a/A/2' employee.txt

    101,John Doe,CEO

    102,Jason Smith,IT MAnager

    103,Raj Reddy,SysAdmin

    104,Anand RAm,Developer

    105,Jane Miller,SAles Manager

    为了方便以下示例,首先建立如下文件

    [root@sishen ~]# vim substitute-locate.txt

    locate command is used to locate files

    locate command uses datebases to locate files

    locate command can also use regex for searching

    ~

    把每行中第二次出的locate替换为find

    [root@sishen ~]# sed 's/locate/find/2' substitute-locate.txt

    locate command is used to find files

    lcaote command uses datebases to locate files

    locate command can also use regex for searching

    打印标志p(print)

    只打印替换后的行

    [root@sishen ~]# sed -n 's/John/Johnny/p' employee.txt

    101,Johnny Doe,CEO

    在之前的数字标志的例子中使用/2来替换第二次出现的locate。第3行中locate只出现了一次所以没有替换任何内容,使用p标志可以只打印替换过的两行

    [root@sishen ~]# sed -n 's/locate/find/2p' substitute-locate.txt

    locate command is used to find files

    locate command uses datebases to find files

    [root@sishen ~]#

    写标志w

    只把替换后的内容写入到out6.txt文件中

    [root@sishen ~]# sed -n 's/John/Johnny/w out6.txt' employee.txt

    [root@sishen ~]# cat out6.txt

    101,Johnny Doe,CEO

    把每行中第二次出现的locate替换为find,把替换后的结果保存到文件中,同时显示输入文件所有内容

    [root@sishen ~]# sed 's/locate/find/2w out7.txt' substitute-locate.txt

    locate command is used to find files

    locate command uses datebases to find files

    locate command can also use regex for searching

    [root@sishen ~]# cat out7.txt

    locate command is used to find files

    locate command uses datebases to find files

    [root@sishen ~]# sed -n 's/locate/find/2w out7.txt' substitute-locate.txt

    [root@sishen ~]# cat out7.txt

    locate command is used to find files

    locate command uses datebases to find files

    [root@sishen ~]#

    注意加上-n参数就不会输出显示在屏幕上

    忽略大小写标志i(ignore)

    [root@sishen ~]# sed 's/john/Johnny/' employee.txt

    101,John Doe,CEO

    102,Jason Smith,IT Manager

    103,Raj Reddy,Sysadmin

    104,Anand Ram,Developer

    105,Jane Miller,Sales Manager

    加上-i参数后才可以实现替换

    [root@sishen ~]# sed 's/john/Johnny/i' employee.txt

    101,Johnny Doe,CEO

    102,Jason Smith,IT Manager

    103,Raj Reddy,Sysadmin

    104,Anand Ram,Developer

    105,Jane Miller,Sales Manager

    执行命令标志w(excuate)

    首先建立文件bash-file.txt

    [root@sishen ~]# cat bash-file.txt

    /etc/passwd

    /etc/group

    在bash-file.txt文件中的每行前面添加 ls -l 并打印结果

    [root@sishen ~]# sed 's/^/ls -l/' bash-file.txt

    ls -l/etc/passwd

    ls -l/etc/group

    在bash-file文件中的每行前面添加ls -l 并把结果作为命令执行

    [root@sishen ~]# sed 's/^/ls -l /e' bash-file.txt

    -rw-r--r-- 1 root root 1623 Oct 12 10:23 /etc/passwd

    -rw-r--r-- 1 root root 818 Oct 12 10:23 /etc/group

    使用替换标志组合

    使用g,I,p和w的组合

    下面的例子将把每行中出现的所有Manager或manager替换为Directory。然后把替换后的内容打印到屏幕上,同时把这些内容保存到out8.txt文件中

    [root@sishen ~]# sed -n 's/manager/Director/igpw out8.txt' employee.txt

    102,Jason Smith,IT Director

    105,Jane Miller,Sales Director

    sed替换命令分界符

    首先新建一个文件path.txt

    reading /usr/local/bin directory

    限制使用sed把/usr/local/bin替换为/usr/bin,在下面的例子中,sed默认的分界符/都被转义

    [root@sishen ~]# sed 's//usr/local/bin//usr/bin/' path.txt

    reading /usr/bin directory

    这样虽然实现了替换,但是操作中很繁琐,所以你可以使用任何一个字符(包括字母,但是不建议这样做)

    作为sed替换命令的分界符。如 | 或 ^ 或!如

    [root@sishen ~]# sed 'sA/usr/local/bin/A/usr/bin/A' path.txt

    reading /usr/local/bin directory

    [root@sishen ~]# sed 's|/usr/local/bin|/usr/bin|' path.txt

    reading /usr/bin directory

    [root@sishen ~]# sed 's@/usr/local/bin@/usr/bin/@' path.txt

    reading /usr/bin/ directory

    [root@sishen ~]# sed 's^/usr/local/bin^/usr/bin^' path.txt

    reading /usr/bin directory

    [root@sishen ~]# sed 's!/usr/local/bin!/usr/bin!' path.txt

    reading /usr/bin directory

    结果都一样,看自己喜好了

    单行内容以上执行多个命令

    下面的例子演示了在模式空间内执行两个替换命令的过程

    [root@sishen ~]# sed '{

    > s/Developer/IT Manager/

    > s/Manager/Director/

    > }' employee.txt #注意空格

    101,John Doe,CEO

    102,Jason Smith,IT Director

    103,Raj Reddy,Sysadmin

    104,Anand Ram,IT Director

    105,Jane Miller,Sales Director

    分析第4行执行过程

    1. 读取数据:在这一步,sed读取内容到模式空间,此时模式空间的内容为:

    104,Ananda Ram,Developer

    2. 执行命令:第一个命令,s/Developer/IT Manager/执行后,模式空间的内容为:

    104,Anand Ram,IT Manager

    现在在模式空间上执行第二个命令s/Manager/Director/,执行后,模式空间内容为:

    104,Ananda Ram,IT Director

    谨记:sed在第一个命令执行的结果上,执行第二个命令

    3. 打印内容:打印当前模式空间的内容,如下

    104,Ananda Ram,IT Director

    4. 重复循环:移动到输入文件的下一行,然后重复执行第一步,即读取数据

    &的作用----获取匹配到的模式

    挡在replacement-string中使用&时,它会被替换成匹配到的original-string或正则表达式,这是个很有用的东西

    给雇员ID(即第一列的3个数字)加上[ ],如101改成[101]

    [root@sishen ~]# sed 's/^[0-9][0-9][0-9]/[&]/g' employee.txt

    [101],John Doe,CEO

    [102],Jason Smith,IT Manager

    [103],Raj Reddy,Sysadmin

    [104],Anand Ram,Developer

    [105],Jane Miller,Sales Manager

    把每一行放进<>中

    [root@sishen ~]# sed 's/^.*/<&>/' employee.txt

    <101,John Doe,CEO>

    <102,Jason Smith,IT Manager>

    <103,Raj Reddy,Sysadmin>

    <104,Anand Ram,Developer>

    <105,Jane Miller,Sales Manager>

    分组替换(单个分组)

    跟正则表达式中一样,sed中也可以使用分组,分组以(开始,以)结束,分组可以用在回溯引用中,

    回溯引用即重新使用分组所选择的部分正则表达式,在sed替换命令的replacement-string中和正则表达式中,都可以使用回溯引用,

    单个分组

    [root@sishen ~]# sed 's/([^,]*).*/1/g' employee.txt

    101

    102

    103

    104

    105

    上面例子中:

    l 正则表达式([^,0]*/)匹配字符串从开头到一个逗号之间的所有字符(并将其放入第一个分组中)

    l Replacement-string中的1将代替匹配到的分组

    l g 即是全局标志

    下面例子只会显示/etc/passwd的第一列,即用户名

    [root@sishen ~]# sed 's/([^:]*).*/1/' /etc/passwd

    root

    bin

    daemon

    adm

    lp

    sync

    shutdown

    halt

    mail

    uucp

    operator

    ……

    首先建立下面文件,以便使用

    [root@sishen ~]# vim number.txt

    1

    12

    123

    1234

    12345

    123456

    ~

    格式化输出,增加可读性

    [root@sishen ~]# sed 's/(^|[^0-9.])([0-9]+)([0-9]{3})/12,3/g' number.txt

    1

    12

    123

    1,234

    12,345

    123,456

    分组替换(多个分组)

    可以使用多个和()

    划分多个分组,使用多个分组时,需要在replacement-string中使用 来指定第n个分组,如下面的示例如只打印第一列(雇员ID)和第3列(雇员职位)

    [root@sishen ~]# sed 's/^([^,]*),([^,]*),([^,*])/1,3/' employee.txt

    101,CEO

    102,IT Manager

    103,Sysadmin

    104,Developer

    105,Sales Manager

    在这个例子中可以看到,original-string中,划分了3个分组,以逗号分隔

    l ([^,]*)第一个分组,匹配雇员ID

    l ,为字段分隔符

    l ([^,]*)为第二个分组,匹配雇员姓名

    l ,为字段分割符,上面的例子演示了如何使用分组

    l 1代表第一个分组,(雇员ID)

    l ,出现在第一个分组之后的逗号

    l 3代表第二个分组(雇员职位)

    注意:sed最多能处理9个分组,分别用1至9表示

    交换第一列(雇员ID)和第二列(雇员姓名)

    [root@sishen ~]# sed 's/^([^,]*),([^,]*),([^,]*)/2,1,3/' employee.txt

    John Doe,101,CEO

    Jason Smith,102,IT Manager

    Raj Reddy,103,Sysadmin

    Anand Ram,104,Developer

    Jane Miller,105,Sales Manager

    sed专有的替换标志

    l 标志(小写的 L,理解为lower)

    当在replacement-string中使用l标志时,它会把紧跟在其后的字符当作小写字符来处理,如你所知,下面的例子将把John换成JOHNNY:

    [root@sishen ~]# sed -n 's/John/JOHNNY/p' employee.txt

    101,JOHNNY Doe,CEO

    下面的例子将把JOHNNY 中的H换成h

    [root@sishen ~]# sed -n 's/John/JOlHNNY/p' employee.txt

    101,JOhNNY Doe,CEO

    L 标志

    当在replacement-string中使用L标志时,它会把后面所有的字符都当小写字符来处理,例如:

    在replacement-string中的H前放置了L 标志,它会把H和它后面的所有字符都换成小写:

    [root@sishen ~]# sed -n 's/John/JOLHNNY/p' employee.txt

    101,JOhnny Doe,CEO

    u标志(理解为upper)和l类似,只不过是把字符换成大写,当在replacemen-string中使用u标志时,它会把紧跟其后的字符当作大写字符来处理,下面的例子中,replacement-string里面的h前面有u的标志,所以h将被换成大写的H:

    [root@sishen ~]# sed -n 's/John/jouhnny/p' employee.txt

    101,joHnny Doe,CEO

    U标志

    当在replacement-string中使用U标志时,它会把后面所有的字符都当作大写字符来处理。如下:replacement-string里面的h前面有U的标志,所以h及其后的所有字符都将被换成大写:

    [root@sishen ~]# sed -n 's/John/joUhnny/p' employee.txt

    101,joHNNY Doe,CEO

    E标志(理解为exit)

    E标志需要和U或者L一起使用,他将关闭U或L的功能,例如将字符串“Johnny Boy”的每个字符都以大写的形式打印出来,因为在replacement-string前面使用了U标志

    [root@sishen ~]# sed -n 's/John/UJohnny Boy/p' employee.txt

    101,JOHNNY BOY Doe,CEO

    下面将把John换成JOHNNY Boy

    [root@sishen ~]# sed -n 's/John/UJohnnyE Boy/p' employee.txt

    101,JOHNNY Boy Doe,CEO

    因为在Johnny后面使用了E标志,关闭了U的功能

    替换标志的用法

    如下将雇员ID都显示为大写,职位都显示为小写:

    [root@sishen ~]# sed 's/([^,]*),([^,]*),([^,]*)/U2E,1,L3/' employee.txt

    JOHN DOE,101,ceo

    JASON SMITH,102,it manager

    RAJ REDDY,103,sysadmin

    ANAND RAM,104,developer

    JANE MILLER,105,sales manager

    这个例子中

    l U23把第二个分组转换为大写,然后使用E关闭转换

    l L3 把第三分组转换为小写

  • 相关阅读:
    Linux centosVMware Linux监控平台介绍、zabbix监控介绍、安装zabbix、忘记Admin密码如何做
    Linux centosVMware Linux集群架构LVS DR模式搭建、keepalived + LVS
    Linux centosVMware 集群介绍、keepalived介绍、用keepalived配置高可用集群
    Linux centosVMware 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志
    Linux centosVMware Tomcat介绍、安装jdk、安装Tomcat
    Linux centosVMware xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
    Linux centosVMware NFS介绍、NFS服务端安装配置、NFS配置选项
    Linux centosVMware NFS exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp
    Linux centosVMware mysql用户管理、常用sql语句、mysql数据库备份恢复
    Linux centosVMware MySQL常用操作设置更改root密码、连接mysql、mysql常用命令
  • 原文地址:https://www.cnblogs.com/zd520pyx1314/p/6061337.html
Copyright © 2011-2022 走看看