zoukankan      html  css  js  c++  java
  • shell语法 04-Linux文本处理-sed

    • sed软件从文件或管道中循环的读取一行,处理一行,输出一行。
    • 模式空间,sed软件内部是一个临时缓存,用于存放读取到的内容。

    软件版本

    sed --version
    GNU sed version 4.2.1
    

    语法格式

    sed [option] [sed commands] [file]
    sed	[选项]   [sed命令]      [输入文件]
    

    sed选项

    选 项 功 能
    -n 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
    -e 多重编辑,且命令顺序会影响结果
    -f 指定一个 sed 脚本文件到命令行执行
    -r Sed 使用扩展正则
    -i 直接修改文档读取的内容,不在屏幕上输出

    sed 命令

    命 令 说 明
    a 在当前行后添加一行或多行
    c 用新文本修改(替换)当前行中的文本
    d 删除行
    i 在当前行之前插入文本
    h 把模式空间里的内容复制到暂存缓存区
    H 把模式空间里的内容追加到暂存缓存区
    g 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
    G 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
    l 列出非打印字符
    p 打印行
    n 读入下一输入行,并从下一条命令而不是第一条命令开始处理
    q 结束或退出 sed
    r 从文件中读取输入行
    对所选行意外的所有行应用命令
    s 用一个字符串替换另一个
    g 在行内进行全局替换
    p 打印行
    w 将行写入文件
    x 交换暂存缓冲区与模式空间的内容
    y 将字符转换为另一字符(不能对正则表达式使用 y 命令)

    sed地址范围显示

    • sed软件可以对单行或多行进行处理。
    • 如果在sed命令前面不指定地址范围,那么默认会匹配所有行。
    • 用法:n1[,n2]{sed-commands}
      • 地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。
    例子 功能
    10i 对第10行操作
    10,20i 对10到20行操作,包括第10,20行
    10,+20i 对10到30(10+20)行操作,包括第10,30行
    1~2i 对1,3,5,7,……行操作
    10,$i 对10到最后一行($代表最后一行)操作,包括第10行
    /oldboy/i 对匹配oldboy的行操作
    /oldboy/,/Alex/i 对匹配oldboy的行到匹配Alex的行操作
    /oldboy/,$i 对匹配oldboy的行到最后一行操作
    /oldboy/,10i 对匹配oldboy的行到第10行操作如果前10行没有匹配到oldboy,而10行以后匹配oldboy的,则会显示出来。
    1,/Alex/i 对第1行到匹配Alex的行操作
    /oldboy/,+2i 对匹配oldboy的行到其后的2行操作

    增删改查

    • a --追加文本到指定行后
    • i --插入文本到指定行前
    在第二行后面添加内容
    sed '2a 106,dandan,CSO' person.txt
    
    在第二行插入内容
    sed '2i 106,dandan,CSO' person.txt
    
    在第二行后面添加两行内容
    sed '2a 106,dandan,CSO
    107,bingbing,CCO' person.txt
    

    • d --删除指定的行
    删除所有行
    sed 'd' person.txt
    
    删除第二行
    sed '2d' person.txt
    
    删除第二到五行
    sed '2,5d' person.txt
    
    删除从第三行开始到最后
    sed '3,$d' person.txt
    
    删除有关键字zhangyao的行
    sed '/zhangyao/d' person.txt
    
    删除有oldboy的行到包含Alex的行(范围)
    sed '/oldboy/,/Alex/d' person.txt
    

    • c --用新行取代旧行
    将第二行替换成其他内容
    sed '2c 106,dandan,CSO' person.txt
    
    • s --用一个字符串替换另一个
    • g --在行内进行全局替换
    • -i --修改文件内容
    sed -i 's/内容1/内容2/g' oldboy.log
    sed -i 's#内容1#内容2#g' oldboy.log
    
    定界符/或#,也可以是任意符号如:或|等,但当替换内容包含定界符时,需转义。
    默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。
    定界符第一个和第二个之间的就是被替换的内容(可以使正则表达式),第二个和第三个之间的就是替换后的内容(必须是具体内容)。
    
    指定行修改内容
    sed '3s#0#9#' person.txt
    
    指定变量的内容去替换
    sed "s#$x#$y#g" test.txt
    eval sed 's#$x#$y#g' test.txt
    
    用sed命令重命名当前目录下包含_finished的jpg文件
    ls *.jpg |sed -r 's#(^.*)_finished.*#mv & 1.jpg#g' |bash
    
    ls *.jpg	--列出所有的jpg文件
    sed -r	--使用正则表达式匹配
    (^.*)		--匹配任意字符串开头
    _finished.*	--匹配包含_finished.,并任意字符串结尾
    mv &	-- &是显示前面匹配到的结果
    1		-- 显示前面括号内匹配到的内容
    |bash	-- 以命令的形式执行替换后内容
    
    修改前
    stu_102999_1_finished.jpg 
    
    
    以命令的形式执行替换后内容
    mv stu_102999_1_finished.jpg stu_102999_1.jpg
    

    • p --输出指定内容
      • 但默认会输出2次匹配的结果
      • 使用n取消默认输出
    显示第二行内容
    sed -n '2p' person.txt
    
    显示第二到第三行
    sed -n '2,3p' person.txt
    
    显示所有行
    sed -n 'p' person.txt
    
    显示包含CTO的行
    sed -n '/CTO/p' person.txt
    
    显示包含CTO的行到包含CFO的行(范围)
    sed -n '/CTO/,/CFO/p' person.txt
    
    显示从第二行到包含CFO的行(范围)
    sed -n '2,/CFO/p' person.txt
    
  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/9419252.html
Copyright © 2011-2022 走看看