shell sed(流编辑器)的基本使用
文章目录
- 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(流编辑器)的基本使用相关推荐
- 文本处理三剑客之 sed 流编辑器(基础部分)
文本处理三剑客之 sed 流编辑器(基础部分) SED 即 Stream EDitor.和交互式编辑器如 vi 需要打开整个文件不同,sed 是行编辑器,每次处理一行,比较适合在脚本中进行无交互编辑, ...
- Linux Shell编程笔记6 sed流编辑器
简介 sed是一个流编辑器,它会读取文件流,以行为单位进行处理.sed会按照顺序执行对每一行执行命令.sed把每一行结果写入标准输出,不修改任何输入文件.一般来说,文件流需要处理每一行的时候,需要借助 ...
- sed 流编辑器 简介及原理
原文链接:http://blog.csdn.net/longerzone/article/details/24718255 1. sed 简介及原理简析 1.1 sed 简介 Sed 是什么?相信很多 ...
- 【shell】shell脚本实战-sed流编辑器
文章目录 sed的介绍 sed的执行过程 sed的用法 sed常用选项 实战案例 1. 将 passwd中root替换为zmgaosh 2. 按行查找替换 1)单行替换: 2)多行替换: 3)删除2- ...
- linux流编辑器,linux sed 流编辑器
sed 是一种新型的,非交互式的编辑器. sed -V or sed --version 可以查看sed版本 sed 的工作过程 sed编辑器逐行处理文件或输入,并将输出结果发到屏幕. sed把当前 ...
- linux——sed 流编辑器
sed 对字符的处理 p 模式--显示 d 模式--删除 a 模式--添加 c 模式--替换 w 模式--写入 i 模式--插入 p 模式 sed -n '/^#/p' fstab 显示以 # 号开头 ...
- Linux基础命令-sed流编辑器
Linux三剑客-grep命令 Sed 一. 命令介绍 先到帮助文档中查看命令的描述信息 NAME sed - stream editor for filtering and transforming ...
- linux shell中的流编辑器sed的使用
sed流编辑器 23.3.1 sed strem editor 流编辑器 sed编辑器是一行一行的处理文件内容的.正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的 ...
- shell脚本编程笔记(九)—— 初识流编辑器 sed
一. 流编辑器 sed编辑器被称作流编辑器(stream editor).在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入.删除或替换数据中的文本.流编辑器则基于预先提供的一组命令来 ...
最新文章
- 【js】绑定事件的两种方法
- MySQL中 Order By 和 Limit 的排序问题
- 深度学习领域四个不可不知的重大突破
- Docker run 命令【转】
- 如何在Windows 10上跳过回收站以删除文件
- 报错,Unknown custom element: <DeviceVendorStatistics> - did you register the component correctly? For
- python的运行环境是如何搭建的_教女朋友学Python运行环境搭建
- Java多线程详解(基本概念)
- 在你的 Android App 中使用 Flutter | Google开发者大会
- java实现socket.io客户端功能
- pythonnumpy官网_Numpy安装
- 编程视频资源教程汇总
- 优化高德地图加载出现白色
- Kubernetes之Service
- import_meta_graph 和 replicate_model_fn
- 非常全的 matlab 函数
- 电动车AMT换挡规律研究——换挡点计算
- 29 外观模式(Facade模式)详解
- WARN ThreadPoolAsynchronousRunner:608问题解决
- python结合ogr2ogr之地理数据格式转换-2
热门文章
- C#编程, FTP文件上传、下载、重命名公共类
- 【linux服务器】使用csdn云主机的体验与问题
- 老式马桶水封不足的唯一解决方案
- 机器学习中的隐变量和隐变量模型
- C++ GUI Programming with Qt4 Second Edition 之 附录A.3 Mac系统Qt的安装
- 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java
- 探索Java中empty()与isEmpty()的区别
- Thymeleaf 是个什么?
- qt5.9开发指南 例子
- Oracle 报错:ORA-01438: 值大于为此列指定的允许精度