1 Linux三剑客之Sed:文本处理神器-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux三剑客之Sed:文本处理神器

马哥Linux运维 来源:马哥Linux运维 2024-12-16 15:58 次阅读

关于linux三剑客

  • grep,过滤关键字信息数据。主要是用于查文本内的数据

  • sed ,对文本数据进行编辑,修改原文件内容

  • awk,对文件数据过滤,提取,并且能实现,格式化输出

    • awk对文件数据处理后,还能更美观的展示数据

sed是什么

  • sed软件本身

  • sed提供的加工的命令

  • 给sed提供的源数据
    828eb252-b6dd-11ef-93f3-92fbcf53809c.png

sed语法格式

sed [选项] [sed内置命令字符] [输入文件]

说明:
1.注意 sed 软件及后面选项,sed 命令和输入文件,每个元素之间都至少有一个空格

2.为了避免混淆,文本称呼sed为sed软件.sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的 options(选项)区分,故称为sed命令.

3.sed-commands 既可以是单个sed 命令,也可以是多个sed命令组合.

4.input-file(输入文件)是可选项,sed 还能够从标准输入或管道获取输入
语法
sed替换字符数据
s替换指令
#替换前的数据(正则)#替换后的数据#

sed   's#替换前的数据#替换后的数据#'   file.txt

sed命令执行过程

概括流程:
sed 软件从文件或管道读取一行,处理一行,输出一行;再读取一行.再处理一行.在输出一行....

82a2a6b8-b6dd-11ef-93f3-92fbcf53809c.png

sed参数

sed默认修改的是模式空间内的数据
(简单大白话,sed读取了一行文本数据,放入到内存里进行修改,修改的结果默认不会写入到文件中,只是在内存里修改,且打印让你看到修改的结果)
吧修改的结果写入到文件

就得借助参数的功能
-i 把sed处理的结果,写入到文件,且不在终端打印了
sed -i  's#替换前的数据#替换后的数据#'   file.txt
options[选项]
解释说明
-n    取消默认的 sed 软件的输出,常与 sed 命令的 p 连用
-e    一行命令语句可以执行多条 sed 命令
-f    选项后面可以接 sed 脚本的文件名
-r    使用正则拓展表达式,默认情况 sed 只识别基本正则表达式
-i    直接修改文件内容,而不是输出终端,如果不使用-i 选项 sed 软件只是修改在 内存中的数据,并不影响磁盘上的文件

sed命令

sed提供了很多功能的指令
在某一行插入数据
替换字符数据

sed-commands[sed 命令]
解释说明
a 追加,在指定行后添加一行或多行文本
c 取代指定的行
d 删除指定的行
D 删除模式空间的部分内容,直到遇到换行符
 结束操作,与多行模式相关
i 插入,在指定的行前添加一行或多行文本
h 把模式空间的内容复制到保持空间
H 把模式空间的内容追加到保持空间
g 把保持空间的内容复制到模式空间
G 把保持空间的内容追加到模式空间
x 交换模式空间和保持空间的内容
l 打印不可见的字符
n 清空模式空间,并读取下一行数据并追加到模式空间
N 不清空模式空间,并读取下一行数据并追加到模式空间
p 打印模式空间的内容,通常 p 会与选项-n 一起使用
P(大写) 打印模式空间的内容,直到遇到换行符你结束操作
q 退出 sed
r 从指定文件读取数据
s 取代,s#old#new#g==>这里 g 是 s 命令的替代标志,注意和 g 命令区分
w 另存,把模式空间的内容保存到文件中
y 根据对应位置转换字符
:label  定义一个标签
t 如果前面的命令执行成功,那么就跳转到 t 指定的标签处,继续往下执行后 续命令,否则,仍然继续正常的执行流程

sed匹配文本范围

82b39c8e-b6dd-11ef-93f3-92fbcf53809c.png

sed的修改字符与取消默认输出

82c1b5e4-b6dd-11ef-93f3-92fbcf53809c.png

sed增删改查(练习) 练习期间,别用-i参数,去修改源文件,直接看替换结果

sed增加字符命令

"a":追加文本到指定行,记忆方法:a 的全拼是 apend,,意思是追加    添加一行或多行文本

3a 表示在第三行下面追加数据

"i":插入文本到指定行前,记忆方法:i 的全拼是 insert,意思是插入   添加一行或多行文本

3i 在第三行上面插入数据

单行增加命令

sed '行号 sed指令 你想添加的字符数据' 源文件
在文件第二行后,插入数据,"今天又是美好的一天"

[242-yuchao-class01 root ~]#sed  '2 a  "今天又是美好的一天" '  t1.log
My name is yuchao.
I teach linux.
"今天又是美好的一天" 
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn

在第二行前,插入数据

sed '2 i  今天雾霾比较大'  t1.log

sed多行增加

增加的数据存在换行

cat实现多行文本追加

cat >>my.log<<EOF
你好
我好
他也好
EOF

echo 追加多行数据

用法如下
[242-yuchao-class01 root ~]#echo -e "hello
world
你好
我也好" > hello.log
[242-yuchao-class01 root ~]#cat hello.log 
hello
world
你好
我也好

sed追加多行文本

cat、还是echo,都只能往文件末尾追加内容。

而sed是按行处理文本,可以指定要处理的行,也就是在指定行插入字符数据。

使用 添加多行数据

给t1.log 开头,添加两行数据
加油
奥力给

[242-yuchao-class01 root ~]#sed -i '1 i 加油
奥力给'  t1.log
[242-yuchao-class01 root ~]#cat -n t1.log 
     1加油
     2奥力给
     3My name is yuchao.
     4I teach linux.
     5I like play computer game.
     6My qq is 877348180.
     7My website is http://www.yuchaoit.cn

练习sed追加配置文件信息(单行)

1.练习,修改nginx配置文件,在第39行插入新数据 listen 81;

只修改,且终端上看到修改结果,但是不修改文件
sed '39 i listen 81;'  /etc/nginx/nginx.conf

sed -i '39 i listen 81;'  /etc/nginx/nginx.conf

修改sshd_config实战
例如我们在系统初始化优化时,需要修改sshd服务端设置,需要加入如下多行配置

Port 25515                                   # 改端口
PermitRootLogin no                   # 不允许root登录
PerminEmptyPasswords no         # 不允许空密码
UseDNS no                                    # 不做主机名解析,加速ssh连接
GSSAPIAuthentication no            # 不做主机名解析,加速ssh连接

修改配置之前先备份源文件

源文件 /etc/ssh/sshd_config
备份,添加ori后缀

cp /etc/ssh/sshd_config{,.ori}

sed写入多行配置 在开头加入这些配置

sed -i '1 i Port 25515
PermitRootLogin no
PerminEmptyPasswords no
UseDNS no
GSSAPIAuthentication no'   /etc/ssh/sshd_config

sed删除字符数据

d 删除指定的行
d 命令,表示删除字符,delete意思

sed默认是多行处理所有文本,如果不指定范围,sed默认是删除所有文本行数据了

sed 删除第二行数据

[242-yuchao-class01 root ~]#sed '2 d' t1.log

sed删除1到4行

sed '1,4d' t1.log

关于sed处理文件行范围语法

82d65ddc-b6dd-11ef-93f3-92fbcf53809c.png

删除第三行数据
sed '3 d'  t1.log
删除文件的36行
sed '3,6 d' t1.log

删除第三行开始,向下2行
sed '3,+2 d'  t1.log

删除奇数行 1,3,5,7,9

sed '1~2 d' t1.log

删除偶数行 2,4,6,8
sed '2~2 d' t1.log

保留前三行
[242-yuchao-class01 root ~]#sed -e  '4,$  d'  t1.log 


找到game那一行,且删掉
[242-yuchao-class01 root ~]#sed '/game/ d' t1.log


删除game这一行到结尾
[242-yuchao-class01 root ~]#sed '/game/,$ d'  t1.log 


删除文件中所有包含game的行,以及它下一行
[242-yuchao-class01 root ~]#sed '/game/,+1 d' t1.log 

打印行范围练习

sed提供打印的命令是p
82ecdbd4-b6dd-11ef-93f3-92fbcf53809c.png

sed删除命令练习

元数据

[yuchao-linux01 root ~]#cat chaoge.log
My name is yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn

删除文件所有行

sed不指定行号的话,默认匹配所有行,执行d删除命令

sed '行号 d命令' 文件
sed 'd' file

删除文件第2行

sed '2 d' file

删除1到3行

sed '1,3 d'

删除第1、2、4行
语法是用分号,隔开多个命令,多次删除

sed '1 d;2 d;4d;' t1.log

删除game的行

sed '/game/d' t1.log

删除game和http的行
也就是删除了2个指定的行

sed '/game/d;/http/d' t1.log

删除My开头的行

sed '/^My/d' t1.log

sed忽略大小写的指令
sed提供了 大写的I 指令 用于忽略大小写

sed '/^My/Id' t1.log

删除以.结尾的行

sed '/.$/d' t1.log

删除第二行到qq的行

sed '2,7d' t1.log
sed '2,/qq/d' t1.log

删除2和5两行

sed '2d;5d' t1.log

删除2到5行

sed '2,5d' t1.log

删除3到尾行

sed '3,$d' t1.log

删除偶数行(步长)

seq 1 10 | sed '2~2d'

删除奇数行(步长)

seq 1 10 | sed '1~2 d'

感叹号取反

Id sed的忽略大小写命令
!d 结果取反

除了有字符yuchao的行,其他都删除

[242-yuchao-class01 root ~]#sed '/yuchao/!d' t1.log 
My name is yuchao.
My website is http://www.yuchaoit.cn

删掉除了My开头的行

sed '/^My/!d' t1.log

sed修改数据

替换整行命令(c)

c    把选定的行改为新的文本。

把11行替换为新数据 ,  睡醒了 精神很饱满
语法
sed ' 11 c   睡醒了,精神很饱满  ' t1.log

替换文件的第二行,改为 "I love linux , python !"

整行全部替换
sed '2c  I love linux , python !' t1.log

替换字符(s命令)

sed替换的命令解释
这个分隔符,常见有如下形式
sed 's/old_string/new_string/'
sed 's#old_string#new_string#'
sed 's@old_string@new_string@'

强烈建议用# 
sed 's#old_string#new_string#'


替换一次
sed 's/替换前字符/替换后字符/' file

全局替换,global 全局替换
sed 's/替换前字符/替换后字符/g' file

s 将每一行第一处匹配的字符替换 
s/old_string/new_string/

sed 's#i#I#'  t1.log


g 全局替换global,每一行,每一处匹配的字符都替换  s/old_string/new_string/

sed 's#i#I#g'  t1.log

sed 's/i/I/g'  t1.log


-i 选项、参数,直接修改文件

sed默认是修改内存中的模式空间数据,不会修改源文件,使用-i会修改源文件,修改磁盘上的文件数据。

测试数据

My name is yuchao. you can call me yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/

字符yuchao改为老于
替换一次

[242-yuchao-class01 root ~]#sed 's#yuchao#老于#' t1.log 
My name is 老于. you can call me yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.老于it.cn , and another website is https://www.yuchao.top/

替换多次,全局替换

sed 's#yuchao#老于#g' t1.log 

替换第三行的computer改为linux

sed '3 s#computer#linux#g' t1.log

所有的My改为His
指定my开头

注意,sed提供了忽略大小写的命令,大写的 I
注意大小写

不加忽略大小写命令的写法
sed 's#^My#His#'  t1.log

添加忽略大小写的命令
sed 's#my#His#Ig'  t1.log
new_name="彭于晏"

注意单引号、双引号的对变量的解析作用
[242-yuchao-class01 root ~]#sed "s#yuchao#$new_name#g"  t1.log

sed分组替换

注意别忘了扩展正则 -r参数

语法:
sed软件也提供了 ()分组功能
使用1引用第一个括号的数据
2引用第二个括号的数据
sed最多记住9个分组

() 1向后引用分组数据

提取出welcome这个单词

echo 'I am teacher yuchao,welcome my linux course' | sed -r 's/^.*,(.*)m.*/1/g'
welcome

分组取出ip

s 表示单个空格

去头去尾法
[242-yuchao-class01 root ~]#ifconfig ens33 | sed -e '2s/^.*inet//' -e '2s/netmask.*//p' -n 
 192.168.0.242  

分组提取法
82f70014-b6dd-11ef-93f3-92fbcf53809c.png

sed查询

sed打印命令p 打印sed正则处理后的数据

并且sed默认打印模式空间,可以用-n取消

文本,10数据 > sed 一行一行的读取,编辑 >> 打印

固定用法,只要使用到了p打印些数据,就是想输出指定数据
必然用-n取消默认打印,目的是,只看到你想p打印的那些数据

打印第二行

sed '2 p ' t1.log

打印前三行

sed '1,3p' t1.log -n

只显示qq号那一行

[242-yuchao-class01 root ~]#sed -r '/[0-9]{9}/p' t1.log -n
My qq is 877348180. my num is 1555555555.

找出http和linux的行

-e 多次编辑
[242-yuchao-class01 root ~]#sed -e '/http/p'  -e '/linux/p' t1.log -n
I teach linux.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/

[242-yuchao-class01 root ~]#sed '/http/p;/linux/p' -n t1.log 
I teach linux.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/

sed其他命令

w命令

作用是将sed操作结果,写入到指定文件

sed '/模式/w new_file' old_file

必须,找出computer这一行,数据写入到game2.log文件中
sed '/computer/w  game2.log' t1.log  -n

替换文件中所有的yuchao为老于,新数据写入 yu.log

sed 's#yuchao#老于#gw yu.log' t1.log -n

-e选项

-e选项用于接上sed多个命令
提取1,2,4行信息

语法
sed -e 'sed命令' -e 'sed命令'  -e 'sed命令'

sed -e '1p' -e '2p'  -e '4p' t1.log -n

; 分号

分号也用于执行多条命令,和linux基础命令一样支持这种写法。

单独提取出1,2,4行信息

sed '1p;2p;4p' t1.log -n
sed -e '1p' -e '2p' -e '4p' t1.log -n


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11291

    浏览量

    209301
  • SED
    SED
    +关注

    关注

    0

    文章

    25

    浏览量

    27084

原文标题:Linux三剑客之Sed:文本处理神器,一分钟掌握核心技能!

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux中grep、sed和awk命令详解

    今天给大家聊一聊Linux文本操作的`三剑客:awk、grep、sed`,因其功能强大、使用频繁,且是Linux
    发表于 04-26 17:20 3238次阅读
    <b class='flag-5'>Linux</b>中grep、<b class='flag-5'>sed</b>和awk命令详解

    Linuxsed命令用法

    这篇文章为初学者提供了关于 Linuxsed 命令的全面指南,涵盖了其历史、用途以及一些实用的技巧和窍门。通过掌握 sed,您可以高效处理文本
    发表于 07-21 10:38 354次阅读
    <b class='flag-5'>Linux</b>中<b class='flag-5'>sed</b>命令用法

    使用 Linux/Unix 进行文本处理

    使用 Linux/Unix 进行文本处理正则表达式 翻译领域不乏让人摸不着头脑的词汇,比如"句柄"、"套接字"、"鲁棒性"。当然
    发表于 11-24 15:39

    shell文本处理方法是什么

    shell文本处理三剑客—grep
    发表于 05-27 12:32

    嵌入式Linux系统知识架构

    嵌入式Linux系统知识架构及层次嵌入式Linux系统构成及启动略析嵌入式Linux三剑客uboot技术嵌入式
    发表于 10-27 07:22

    3ds max7渲染传奇三剑客-VRay教程

    3ds max7渲染传奇三剑客-VRay教程
    发表于 09-07 17:14 0次下载
    3ds max7渲染传奇<b class='flag-5'>三剑客</b>-VRay教程

    锂离子正极三剑客之一:钴酸锂

    锂离子正极三剑客之一:钴酸锂 1,LiCoO2的一种合成方法    &nbs
    发表于 11-04 14:09 1326次阅读

    锂离子正极三剑客之一:锰酸锂

    锂离子正极三剑客之一:锰酸锂 颗粒大小和形貌、粒度分布、比表面积、振实密度以及电极加工性能、
    发表于 11-04 14:33 1263次阅读

    易语言-文本处理

    易语言是一门以中文作为程序代码编程语言学习例程:易语言-文本处理
    发表于 06-06 17:43 1次下载

    Linux Awk用法总结

    Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed
    的头像 发表于 04-13 09:27 5583次阅读
    <b class='flag-5'>Linux</b> Awk用法总结

    Redmi Note 9 Pro系列三剑客正式亮相

    11月26日晚,Redmi召开Note 9系列新品发布会,带来了Note 9三剑客,分别是Note 9 4G版、Note 9、Note 9 Pro。
    的头像 发表于 11-27 09:56 1968次阅读

    关于Linux中的sed简易介绍与工作原理

    熟悉 Linux 的同学一定知道大名鼎鼎的 Linux 三剑客,它们是 grep、awk、sed,我们今天要聊的主角就是 sed
    的头像 发表于 03-26 15:35 2260次阅读
    关于<b class='flag-5'>Linux</b>中的<b class='flag-5'>sed</b>简易介绍与工作原理

    【嵌入式】构建嵌入式Linux系统(uboot、内核、文件系统)

    嵌入式Linux系统知识架构及层次嵌入式Linux系统构成及启动略析嵌入式Linux三剑客uboot技术嵌入式
    发表于 10-20 18:20 42次下载
    【嵌入式】构建嵌入式<b class='flag-5'>Linux</b>系统(uboot、内核、文件系统)

    单日获成本超20万,国产大模型开卷200万字以上的长文本处理

    更精准的推理和高并发流量以外,似乎已经没有太多值得厂商大肆宣传的特性了,直到最近超长文本处理的爆火。   国产大模型的新卷法,长文本处理   当下将大模型长文本处理炒热的,无疑是来自月
    的头像 发表于 03-27 00:53 3360次阅读
    单日获<b class='flag-5'>客</b>成本超20万,国产大模型开卷200万字以上的长<b class='flag-5'>文本处理</b>

    如何掌握Linux文本处理

    /from/sed_script: 从指定的文本中读取处理脚本 -r: 使用扩展正则表达式 sed命令选项 替换标记 g:表示行内全面替换 w:表示把行写入一个文件 x:表示互换模式
    的头像 发表于 11-10 13:40 157次阅读