sed 的基本使用【图解】

1.sed介绍

sed 在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过

  • sed 的使用方法,调用 sed 命令的语法有两种:

    • 在命令行指定 sed 指令对文本进行处理:sed+选项'指令'文件

    • 先将 sed 指令保存到文件中,将该文件作为参数进行调用,

      sed+选项 -f 包含sed指令的文件 文件

    sed的常用选项:

    选项 含义
    -e 它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
    -f 后跟保存了sed指令的文件
    -i 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
    -n 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

    sed中的编辑命令:

    命令 含义
    a-追加 向匹配行后面插入内容
    i-插入 向匹配行前插入内容
    c-更改 更改匹配行的内容
    d-删除 删除匹配的内容
    s-替换 替换掉匹配的内容
    p-打印 打印出匹配的内容,通常与-n选项和用
    = 用来打印被匹配的行的行号
    n 读取下一行,遇到n时会自动跳入下一行
    r,w 读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件

2.使用示例

2.1 追加 --> a

sed 'lahello' test.txt                 #向第一行后面添加hello,1表示行号

​ 上图中,1代表了行号,a是选择追加,但因为没有使用 -i ,所以最后只是预览模式,并没有保存

​ 使用参数 -i如下已保存

  • 批量添加
sed '/22/achina' test.txt
#向内容11后面添加china,如果文件中有多行包括22,则每一行后面都会添加

  • $表示在最后一行添加
sed '$a富强' test.txt        #

  • 在第三行之前插入good
sed '3igood' test.txt  # 在第三行之前插入good

  • 在包含china之前的行插入数据,如果含多个,则都会插入
sed '/china/inice' test.txt  # 在包含china之前的行插入数据,如果含多个,则都会插入

2.2 更改 --> c

sed '7cedg' test.txt  # 将第7行的替换为edg

  • 批量替换
sed '/22/cgoto' test.txt  #将包含22的全部替换为goto

2.3 删除 --> d

sed '7d' test.txt              #删除第7行的数据

  • 隔行删除
sed '1~2d' test.txt    #从第一行开始删除,每隔两行删掉一个,删掉奇数行

  • 范围删除
sed '1,2d' test.txt            #删掉1-2行

  • 删除 除了1-2行之外的行
sed '1,2!d' test.txt   #除了1-2行之外的行

  • 删除最后一行
sed '$d' test.txt      #删除最后一行

  • 删除 除了包含china之外的行
sed '/china/!d' test.txt           #删除 除了包含china之外的行

  • 删除最后一行
sed '$d' test.txt   #删除最后一行
  • 删除匹配55的行以及下一行
sed '/55/,+1d' test.txt  #删除匹配55的行以及下一行

​ 注:匹配了 ‘I love china’ 那行,后面的 'china '已经被删除

  • 删除从匹配到china的行到最后一行
sed '/china/,$d' test.txt  #删除从匹配到china的行到最后一行

  • 删除空行
sed '/^$/d' test.txt  #删除空行 (开始^到结束$中内容没有,因此匹配的是空行)

  • 删除不匹配的行
sed '/china\|^$/!d' test.txt
#删除不匹配 china 或者 空行 的行
#/china\|^$/表示匹配china或者空行,!取反

  • 删除1~5行中,匹配内容china的行
sed '1,5{/china/d}' test.txt   #删除1~5行中,匹配内容china的行

2.4 替换 --> s

  • love替换成爱,默认只替换每行匹配到的第一个
sed 's/love/爱/' test.txt   #将love替换成爱,默认只替换每行第一个love

 # g可将所有love替换成爱
sed 's/love/爱/g' test.txt #2可将每行第二个匹配到的love替换成爱
sed 's/love/爱/2' test.txt

g可将所有的匹配替换

sed -n 's/china/中国/gpw yi.txt' test.txt
#将每行中所有匹配的china替换成中国,并将替换后的行采用覆写的方式写入yi.txt文件中。

替换前:

替换后:

  • 匹配有‘#’号的行,替换匹配行中逗号后 的所有内容为空
sed '/#/s/,.*//g' test.txt    #    匹配有‘#’号的行,替换匹配行中逗号后                                  的所有内容为空#    (,.*)表示逗号后的所在内容

  • 替换每行中的最后两个字符为空
sed 's/..$//g' test.txt
#替换每行中的最后两个字符为空
# 每个点代表一个字符,$表示匹配末尾  (..$)表示匹配最后两个字符

  • 将文件中以’#'开头的行替换成空行
sed 's/^#.*//' test.txt
#   将文件中以'#'开头的行替换成空行
#   ( ^#)表示匹配以#开头,(.*)代表所有内容
sed 's/^#.*//;/^$/d' test.txt
#先替换test.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开

  • 将每一行中行首的数字加上一个小括号
sed 's/^[0-9]/(&)/' yi.txt   #将每一行中行首的数字加上一个小括号   (^[0-9])表示行首是数字,&符号代表匹配的内容

2.5 打印 --> p

sed -n '4p' test.txt         #打印文件中的第4行内容
sed -n '2~2p' test.txt      #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长
sed -n '$p' test.txt    #打印文件的最后一行
sed -n '1,3p' test.txt        #打印1到3行
sed -n '3,$p' test.txt        #打印从第3行到最后一行的内容
sed -n '/love/p' test.txt    #逐行读取文件,打印匹配love的行
sed -n '/china/,3p' test.txt  #逐行读取文件,打印从匹配china的行到第3行的内容
sed -n '1,/china/p' test.txt  #打印第一行到匹配china的行
sed -n '/\*/,$p' test.txt         #打印从匹配*的行到最后一行的内容
sed  -n '/\*/,+1p'  test.txt    #打印匹配*的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行
sed  -n '/china/,/\*/p'  1.txt   #打印从匹配内容china到匹配内容*的行

2.6 行号 --> =

sed -n "$="  test.txt  #  打印文件最后一行的行号
sed -n '/error/=' test.txt #打印匹配error的行的行号
  • 打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)
sed -n '/error/{=;p}' test.txt  #打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)

2.7 读取 --> r

  • 将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容
sed 'r 2.txt' 1.txt

  • 在1.txt第三行之后插入文件2.txt的内容
sed '3r 2.txt' 1.txt

  • 在匹配/的行之后插入文件2.txt的内容,如果1.txt中有多行匹配则在每一行之后都会插入
sed '/\//r 2.txt' 1.txt

sed '$r 2.txt' 1.txt   #在1.txt的最后一行插入2.txt的内容

2.8 写入 --> w

sed  -n  'w 2.txt'   1.txt
#将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt   #将1.txt的第1行和最后一行内容写入2.txtsed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt   #将1.txt的第1行和最后一行分别写入2.txt和3.txtsed  -n  '/abc\|123/w  2.txt'    1.txt   #将1.txt中匹配abc或123的行的内容,写入到2.txt中sed  -n '/666/,$w 2.txt'   1.txt   #将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中sed  -n  '/xyz/,+2w  2.txt'     1.txt     #将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中

2.9 sed在脚本中的使用

批量更改当前目录中的文件后缀名:

  • 1

    #!/bin/bash
    if [ $# -ne 2 ];then        #判断用户的输入,如果参数个数不为2则打印脚本用法echo "Usage:$0 + old-file new-file"exit
    fi
    for i in *$1*                         #对包含用户给定参数的文件进行遍历
    doif [ -f $i ];theniname=`basename $i`        #获取文件名newname=`echo $iname | sed -e "s/$1/$2/g"`   #对文件名进行替换并赋值给新的变量mv  $iname  $newname          #对文件进行重命名fi
    doneexit 666
    
  • 2

    #!/bin/bash
    read -p "input the old file:" old        #提示用户输入要替换的文件后缀
    read -p "input the new file:" new
    [ -z $old ] || [ -z $new ] && echo "error" && exit      #判断用户是否有输入,如果没有输入怎打印error并退出
    for file in `ls *.$old`
    doif [ -f $file ];thennewfile=${file%$old}                        #对文件进行去尾mv $file ${newfile}$new                   #文件重命名fidone
    
  • 3

    #!/bin/bashif [ $# -ne 2 ];then        #判断位置变量的个数是是否为2echo "Usage:$0  old-file  new-file"exit
    fi
    for file in `ls`                      #在当前目录中遍历文件
    doif [[ $file =~ $1$ ]];then   #对用户给出的位置变量$1进行正则匹配,$1$表示匹配以变量$1的值为结尾的文件echo $file                      #将匹配项输出到屏幕进行确认new=${file%$1}             #对文件进行去尾处理,去掉文件后缀保留文件名,并将文件名赋给变量new                  mv $file ${new}$2          #将匹配文件重命名为:文件名+新的后缀名fidone
    
  • 2

       echo "Usage:$0  old-file  new-file"exit
    fi
    for file in `ls`                      #在当前目录中遍历文件
    doif [[ $file =~ $1$ ]];then   #对用户给出的位置变量$1进行正则匹配,$1$表示匹配以变量$1的值为结尾的文件echo $file                      #将匹配项输出到屏幕进行确认new=${file%$1}             #对文件进行去尾处理,去掉文件后缀保留文件名,并将文件名赋给变量new                  mv $file ${new}$2          #将匹配文件重命名为:文件名+新的后缀名fidone
    

sed 的基本使用【详图】相关推荐

  1. Linux 运维常用命令 find、awk、sed、grep、vi、ps、lsof、rpm

    先用一个脚本,模拟创建 14 个测试文件: #!/bin/bash for ((i=1;i<=10;i++)); do if [ $i -lt 3 ] thentouch /home/mysql ...

  2. 【转】sed 简明教程

    本文转自:http://coolshell.cn/articles/9104.html awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了.所以 ...

  3. 用sed 给文本文件加行号

    看例子: [root@localhost tmp]# sed '=' test.txt 1 tsttst tsttsttst 2 west gao 3 west abces [root@localho ...

  4. sed linux 命令

    sed linux 命令 1. Sed简介 2. 定址 3. Sed命令 4. 选项 5. 元字符集 6. 实例 7. 脚本 1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把 ...

  5. linux sed高级用法,sed 高级用法

    首先,应该明白模式空间的定义.模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的.这对接下来的学习是有帮助的. 在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一 ...

  6. 使用sed快速批量替换文件夹内的文件中的某个字段

    业务场景如下: 当某些脚本要分发到不同的部署点,但是脚本中的ip可能不同,如何快速替换这些文件中的指定ip呢? 参见下面的命令 对一个文件做替换 sed -i -e "s/192.168.9 ...

  7. linux 命令之文件读取,head, tail, tailf, sed

    head 看文件的前100行 head -100  filename tail/tailf 查看文件的后100行 tail -100  filename 或 tail -n 100  filename ...

  8. linux 正则查找email_Linux生产环境上,最常用的一套“Sed“技巧

    sed命令应用广泛,使用简单,是快速文本处理的利器.它其实没多少技巧,背诵.使用是最合适的学习渠道,属于硬技能.但它又很复杂,因为高级功能太多.本篇不去关注sed的高级功能,仅对常用的一些操作,进行说 ...

  9. sed及awk显示指定行内容

    文件内容为 [root@test1 test]# cat file.test 1 2 3 4 5 6 7 8 9 10 1. 显示第二行内容(指定行) 1)sed [root@test1 test]# ...

最新文章

  1. 条件变量 pthread_cond_wait
  2. App Store生存法则:iOS开发者经验分享
  3. linux 目录说明
  4. 56岁潘石屹下定决心学Python,60多岁程序语言之父们还在敲代码,你还敢懈怠吗?...
  5. 海量数据选取重复次数最多的n个
  6. 天气预报的Ajax效果
  7. 中原标准时间对时_GPS对时系统(时间同步系统)应用电子政务
  8. CVPR 2020 Oral:北大华为等提出只用加法的神经网络,重磅开源
  9. 20150318知识小结
  10. python是什么软件-学习python用什么软件
  11. 《Arduino实战》——2.5 小结
  12. 图书管理系统/库存管理系统等计算机毕业论文设计
  13. 奥斯汀页眉怎么设置_Word页眉横线怎么去掉与页眉页脚如何设置删除,含首页、奇数偶数页、横纵向页不同及第一页与最后一页不要页...
  14. Ubuntu 18.04 ibus安装配置中文拼音输入法
  15. 音视频同步、网络抖动
  16. 微型计算机拆卸步骤,《微型计算机拆卸》PPT课件.ppt
  17. html5适配屏幕,HTML5屏幕适配标签设置
  18. 单片机遥控车c语言程序,基于51单片机的无线遥控小车设计[附发射接收程序]
  19. Navicat中设计表时int类型的长度说明
  20. Ubuntu 18.04 进入 Recovery 模式

热门文章

  1. QGI缓冲区渐变色符号制作
  2. 融合收敛因子和樽海鞘群的蝴蝶优化算法-附代码
  3. vscode实现上下拆分左右拆分的分屏设置方法
  4. [Ext JS]3.2 表单(Form)及表单元素
  5. 第17章 高级数据表示 17.5用队列进行模拟
  6. 树莓派4的WiFi设置
  7. 福利 | 度过五一小长假最后一天的正确姿势
  8. html web前端基础(1)
  9. ChatGPT“克星”:用AI识别AI生成的文本,英语论文阅读笔记都能测出
  10. linux系统中VIM编辑器推荐安装插件