文章目录

  • 1、基本用法
  • 2、案例1
  • 3、案例2
    • 示例1:向文件中添加或插入行
    • 示例2:更改文件中指定的行
    • 示例3:删除文件中的行
    • 示例4:替换文件中的内容
    • 示例5:打印文件中的行
    • 示例6:打印文件的行号
    • 示例7:从文件中读取内容
    • 示例8:向文件中写入内容
    • 示例9:sed 在shell脚本中的使用
      • 实例1:替换文件中的内容
      • 实例2:删除文件中的空白行
      • 实例3:格式化文本内容
  • 4、实用脚本:批量更改当前目录中的文件后缀名:
    • 示例1:
    • 示例2:
    • 示例3:
    • 示例4:使用sed匹配文件中的IP地址

sed 是一种 流 编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在 临时缓冲区 中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕 。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

1、基本用法

sed [选项]  '指令命令'  filename

选项

options 参数 功能
-e 连续执行多个sed指令
-r 使用扩展正则表达式
-i 直接对内容进行修改,不加 -i 时,默认只是预览
-n 取消默认输出,只显示处理过的行。sed 默认会输出所有文本内容
-f sed指令的文件

指令命令

命令 功能描述
a 追加。在 匹配行 后面下一行 追回内容。
'a xxx' 表示在 第1行 下面 插入 xxx 字符串,
'2a xxx' 表示在 第2行 下面 插入 xxx。以此论推。
i 插入。向 匹配行的 前面 插入内容
d 删除。删除匹配的内容
s 查找并替换。 替换掉匹配的内容
c 更改。更改匹配行的内容
p 打印。打印出匹配的内容,通常与-n选项和用
= 用来打印被匹配的行的行号
n 读取下一行。遇到n时会自动跳入下一行
r,w 读和写编辑命令。
r 用于将内容读入文件,
w 用于将匹配内容写入到文件

sed 匹配字符

  • ^ :匹配行开始,如:/^sed/ 匹配所有以 sed 开头的行。
  • $ :匹配行结束,如:/sed$/ 匹配所有以 sed 结尾的行。
  • . :匹配 一个 非换行符的任意字符,如:/s.d/ 匹配 s 后接一个任意字符,最后是 d 。
  • * :匹配0个或多个字符,如:/*sed/ 匹配所有模板是一个或多个空格后紧跟sed的行。

2、案例1

(0)数据准备

[java@localhost java_demo]$ touch sed.txt
[java@localhost java_demo]$ vim sed.txt
dong shen
guan zhen
wo  wo
lai  laile  le

(1)将 mei nv 这个单词插入到 sed.txt 第2行下面 ,打印。

插入的命令参数 a ,插入到 第2行 使用 2a,具体如下:

[java@localhost java_demo]$ sed '2a mei nv' sed.txt
dong shen
guan zhen
mei nv
wo  wo
lai  laile  le

sed.txt 文件并没有改变,如下:

[java@localhost java_demo]$ cat sed.txt
dong shen
guan zhen
wo  wo
lai  laile  le

(2)删除 sed.txt 文件所有包含 wo 的行

删除的命令参数 d ,所有包含 wo ,则是/wo/ ,综合使用如下:

[java@localhost java_demo]$ sed '/wo/d' sed.txt
dong shen
guan zhen
lai  laile  le

(3)将 sed.txt 文件中 wo 替换为 ni

替换的命令参数 s ,wo 替换为 ni 的命令是 s/wo/ni/g ,综合使用如下:

[java@localhost java_demo]$ sed 's/wo/ni/g' sed.txt
dong shen
guan zhen
ni  ni
lai  laile  le

注意: g 表示 global ,全局、全部。 配合 s 表示 全部替换。

(4)将 sed.txt 文件中的第2行删除, 并将 wo 替换为 ni

[java@localhost java_demo]$ cat sed.txt    # 原始数据
dong shen
guan zhen
wo  wo
lai  laile  le
[java@localhost java_demo]$ sed -e '2d' -e 's/wo/ni/g' sed.txt    # 操作后的数据(说明 sed.txt 内容未改变)
dong shen
ni  ni
lai  laile  le

3、案例2

示例1:向文件中添加或插入行

sed '3ahello' 1.txt
# 向第3行后面添加 hello,3表示行号

sed '/123/ahello' 1.txt
# 向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加.

sed  '$ahello'  1.txt
# 在最后一行添加hello

sed '3ihello'  1.txt
# 在第三行之前插入hello

sed '/123/ihello'  1.txt
# 在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello

sed '$ihello'  1.txt
# 在最后一行之前插入hello

示例2:更改文件中指定的行

sed  '1chello'  1.txt
# 将文件1.txt的第一行替换为hello

sed  '/123/chello'  1.txt
# 将包含123的行替换为hello

sed '$chello'  1.txt
# 将最后一行替换为hello

示例3:删除文件中的行

sed  '4d'  1.txt
# 删除第四行

sed '1~2d' 1.txt
# 从第一行开始删除,每隔2行就删掉一行,即删除奇数行

sed   '1,2d'  1.txt
# 删除1~2行

sed  '1,2!d'  1.txt
# 删除1~2之外的所有行

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

sed  '/123/d' 1.txt
# 删除匹配123的行

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

sed  '/123/,+1d'  1.txt
# 删除匹配123的行及其后面一行

sed  '/^$/d'    1.txt
# 删除空行

sed   '/123\|abc/!d'  1.txt
# 删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反

sed  '1,3{/123/d}'   1.txt
# 删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行

示例4:替换文件中的内容

sed 's/^/#&/g' 1.txt
# 在1.txt文件中的每一行开头加一个#

sed  's/123/hello/'   1.txt
# 将文件中的123替换为hello,默认只替换每行第一个123

sed  's/123/hello/g'  1.txt
# 将文本中所有的123都替换为hello

sed 's/123/hello/2'   1.txt
# 将每行中第二个匹配的123替换为hello

sed  -n 's/123/hello/gpw  2.txt'   1.txt
# 将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt
# g : 全局
# p 打印的内容
# w 将匹配内容写入文件

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

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

sed 's/^#.*//'  1.txt
# 将1.txt文件中以#开头的行替换为空行,即注释的行  ( ^#)表示匹配以#开头,(.*)代表所有内容

sed 's/^#.*//;/^$/d'  1.txt
# 先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开

sed 's/^[0-9]/(&)/'   1.txt
# 将每一行中行首的数字加上一个小括号   (^[0-9])表示行首是数字,&符号代表匹配的内容或者  sed 's/[0−9][0−9]/(\1)/'   1.txt
# 替换左侧特殊字符需钥转义,右侧不需要转义,\1代表匹配的内容

sed  's/$/&'haha'/'  1.txt
# 在1.txt文件的每一行后面加上"haha"字段

示例5:打印文件中的行

sed  -n '3p'  1.txt   # 打印文件中的第三行内容

sed  -n '2~2p'  1.txt
# 从第二行开始,每隔两行打印一行,波浪号后面的2表示步长

sed -n '$p'  1.txt
# 打印文件的最后一行

sed -n '1,3p'  1.txt
# 打印1到3行

sed  -n '3,$p'  1.txt
# 打印从第3行到最后一行的内容

sed  -n '/you/p'  1.txt
# 逐行读取文件,打印匹配you的行

sed  -n '/bob/,3p'  1.txt
# 逐行读取文件,打印从匹配bob的行到第3行的内容sed  -n  '/you/,3p'  1.txt
# 打印匹配you 的行到第3行,也打印后面所有匹配you 的行

sed  -n '1,/too/p'  1.txt    # 打印第一行到匹配too的行sed  -n  '3,/you/p'  1.txt   # 只打印第三行到匹配you的行

sed  -n '/too/,$p'  1.txt
# 打印从匹配too的行到最后一行的内容

sed  -n '/too/,+1p'  1.txt
# 打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行

sed  -n '/bob/,/too/p'  1.txt
# 打印从匹配内容bob到匹配内容too的行

示例6:打印文件的行号

sed  -n "$="   1.txt
# 打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)

sed  -n '/error/='  1.txt
# 打印匹配error的行的行号sed  -n '/error/{=;p}'   1.txt
# 打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)

示例7:从文件中读取内容

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

sed '3r 2.txt'  1.txt
# 在1.txt的第3行之后插入文件2.txt的内容(可用于向文件中插入内容)

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

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

示例8:向文件中写入内容

sed  -n  'w 2.txt'   1.txt
# 将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容

#将文件1.txt中的第2行内容写入到文件2.txt
sed   -n '2w  2.txt'   1.txt

# 将1.txt的第1行和最后一行内容写入2.txt
sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt   # 将1.txt的第1行和最后一行分别写入2.txt和3.txt
sed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt

# 将1.txt中匹配abc或123的行的内容,写入到2.txt中
sed  -n  '/abc\|123/w  2.txt'    1.txt

# 将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中
sed  -n '/666/,$w 2.txt'   1.txt

# 将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中
sed  -n  '/xyz/,+2w  2.txt'     1.txt

示例9:sed 在shell脚本中的使用

实例1:替换文件中的内容

#!/bin/bash
if [ $# -ne 3 ];then            #判断参数个数echo "Usage:  $0 old-part new-part filename"    #输出脚本用法exit
fised -i "s#$1#$2#"  $3          # 将 旧内容进行替换,当$1和$2中包含"/"时,替换指令中的定界符需要更换为其他符号

实例2:删除文件中的空白行

#!/bin/bashif [ ! -f $1 ];then         #判断参数是否为文件且存在echo "$0 is not a file"exitfised -i "/^$/d"   $1 #将空白行删除

实例3:格式化文本内容

#!/bin/bash
a='s/^  *>//      #定义一个变量a保存sed指令,'s/^ *>//':表示匹配以0个或多空格开头紧跟一个'>'号的行,将匹配内容替换
s/\t*//                 #'s/\t*//':表示匹配以0个或多个制表符开头的行,将匹配内容替换s/^>//               #'s/^>//' :表示匹配以'>'开头的行,将匹配内容替换s/^ *//'               #'s/^ *//':表示匹配以0个或多个空格开头的行,将匹配内容替换
#echo $a
sed "$a" $1        #对用户给定的文本文件进行格式化处理

4、实用脚本:批量更改当前目录中的文件后缀名:

示例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

示例4:使用sed匹配文件中的IP地址

sed -nr  '/([0-9]{1,3}\.){3}([0-9]{1,3})/p'  1.txt

shell sed(流编辑器)的基本使用相关推荐

  1. 文本处理三剑客之 sed 流编辑器(基础部分)

    文本处理三剑客之 sed 流编辑器(基础部分) SED 即 Stream EDitor.和交互式编辑器如 vi 需要打开整个文件不同,sed 是行编辑器,每次处理一行,比较适合在脚本中进行无交互编辑, ...

  2. Linux Shell编程笔记6 sed流编辑器

    简介 sed是一个流编辑器,它会读取文件流,以行为单位进行处理.sed会按照顺序执行对每一行执行命令.sed把每一行结果写入标准输出,不修改任何输入文件.一般来说,文件流需要处理每一行的时候,需要借助 ...

  3. sed 流编辑器 简介及原理

    原文链接:http://blog.csdn.net/longerzone/article/details/24718255 1. sed 简介及原理简析 1.1 sed 简介 Sed 是什么?相信很多 ...

  4. 【shell】shell脚本实战-sed流编辑器

    文章目录 sed的介绍 sed的执行过程 sed的用法 sed常用选项 实战案例 1. 将 passwd中root替换为zmgaosh 2. 按行查找替换 1)单行替换: 2)多行替换: 3)删除2- ...

  5. linux流编辑器,linux sed 流编辑器

    sed 是一种新型的,非交互式的编辑器. sed -V  or sed --version 可以查看sed版本 sed 的工作过程 sed编辑器逐行处理文件或输入,并将输出结果发到屏幕. sed把当前 ...

  6. linux——sed 流编辑器

    sed 对字符的处理 p 模式--显示 d 模式--删除 a 模式--添加 c 模式--替换 w 模式--写入 i 模式--插入 p 模式 sed -n '/^#/p' fstab 显示以 # 号开头 ...

  7. Linux基础命令-sed流编辑器

    Linux三剑客-grep命令 Sed 一. 命令介绍 先到帮助文档中查看命令的描述信息 NAME sed - stream editor for filtering and transforming ...

  8. linux shell中的流编辑器sed的使用

    sed流编辑器 23.3.1  sed  strem editor 流编辑器 sed编辑器是一行一行的处理文件内容的.正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的 ...

  9. shell脚本编程笔记(九)—— 初识流编辑器 sed

    一. 流编辑器 sed编辑器被称作流编辑器(stream editor).在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入.删除或替换数据中的文本.流编辑器则基于预先提供的一组命令来 ...

最新文章

  1. 【js】绑定事件的两种方法
  2. MySQL中 Order By 和 Limit 的排序问题
  3. 深度学习领域四个不可不知的重大突破
  4. Docker run 命令【转】
  5. 如何在Windows 10上跳过回收站以删除文件
  6. 报错,Unknown custom element: <DeviceVendorStatistics> - did you register the component correctly? For
  7. python的运行环境是如何搭建的_教女朋友学Python运行环境搭建
  8. Java多线程详解(基本概念)
  9. 在你的 Android App 中使用 Flutter | Google开发者大会
  10. java实现socket.io客户端功能
  11. pythonnumpy官网_Numpy安装
  12. 编程视频资源教程汇总
  13. 优化高德地图加载出现白色
  14. Kubernetes之Service
  15. import_meta_graph 和 replicate_model_fn
  16. 非常全的 matlab 函数
  17. 电动车AMT换挡规律研究——换挡点计算
  18. 29 外观模式(Facade模式)详解
  19. WARN ThreadPoolAsynchronousRunner:608问题解决
  20. python结合ogr2ogr之地理数据格式转换-2

热门文章

  1. C#编程, FTP文件上传、下载、重命名公共类
  2. 【linux服务器】使用csdn云主机的体验与问题
  3. 老式马桶水封不足的唯一解决方案
  4. 机器学习中的隐变量和隐变量模型
  5. C++ GUI Programming with Qt4 Second Edition 之 附录A.3 Mac系统Qt的安装
  6. 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java
  7. 探索Java中empty()与isEmpty()的区别
  8. Thymeleaf 是个什么?
  9. qt5.9开发指南 例子
  10. Oracle 报错:ORA-01438: 值大于为此列指定的允许精度