当前位置: 首页 > article >正文

Shell中sed的用法

sed是一款强大的流式文本处理工具,主要用于对文本进行查找、替换、删除、插入等操作。

常用命令

命令说明
s/old/new/替换第一个匹配的字符串(old 替换为 new)。
s/old/new/g替换所有匹配的字符串(全局替换)。
p打印当前行。
d删除当前行。
a\text在指定行后追加文本。
i\text在指定行前插入文本。
c\text替换指定行的内容。

sed命令的常用选项如下:

-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r(支持扩展正则)
-i(修改源文件)

条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令,指令可以是p输出、d删除、s替换

使用sed
1)行号案例
[root@sv7 ~]# head -5 /etc/passwd > user    #准备素材文件
[root@sv7 ~]# sed -n 'p' user               #输出所有行
[root@sv7 ~]# sed -n '1p' user              #输出第1行
[root@sv7 ~]# sed -n '2p' user              #输出第2行
[root@sv7 ~]# sed -n '3p' user              #输出第3行

[root@sv7 ~]# sed -n '2,4p' user            #输出2~4行
[root@sv7 ~]# sed -n '2p;4p' user           #输出第2行与第4行
[root@sv7 ~]# sed -n '3,+1p' user           #输出第3行以及后面1行
[root@sv7 ~]# sed -n '1~2p' user            #输出奇数行
[root@sv7 ~]# cat -n user | sed -n '1~2p'   #输出奇数行,使用cat -n 打印行号;1~2p:起点为1,步长为2
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@sv7 ~]# cat -n user | sed -n '2~2p'   #输出偶数行,2~2p:起点为2,步长为2
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     
2)使用正则当条件
[root@sv7 ~]# sed -n '/^root/p' user        #输出以root开头的行 
[root@sv7 ~]# sed -n '/root/p' user         #输出包含root的行
[root@sv7 ~]# sed -n '/bash$/p' user        #输出bash结尾的行
[root@sv7 ~]# sed -nr '/^root|^bin/p' user  #输出以root开头的行或bin开头的行,|是扩展正则,需要r选项

3)特殊用法
[root@sv7 ~]# sed -n '1!p' user             #输出除了第1行的内容,!是取反
[root@sv7 ~]# sed -n '$p' user              #输出最后一行
[root@sv7 ~]# sed -n '=' user               #输出行号,如果是$=就是最后一行的行号
以上操作,如果去掉-n,再将p指令改成d指令就是删除

步骤三:sed工具的p、d、s操作指令案例集合
1)p指令案例集锦
[root@sv7 ~]# sed -n 'p' user               #输出所有行,等同于cat user
[root@sv7 ~]# sed -n '4p' user              #输出第4行
[root@sv7 ~]# sed -n '4,7p' user            #输出第4~7行
[root@sv7 ~]# sed -n '/^bin/p' user         #输出以bin开头的行
[root@sv7 ~]# sed -n '$=' user              #输出文件的行数

2)d指令案例集锦
[root@sv7 ~]# sed '3,5d' user               #删除第3~5行
[root@sv7 ~]# sed '/root/d' user            #删除所有包含root的行
[root@sv7 ~]# sed '/root/!d' user           #删除不包含root的行,!符号表示取反
[root@sv7 ~]# sed '/^dae/d' user            #删除以dae开头的行
[root@sv7 ~]# sed '$d' user                 #删除文件的最后一行
[root@sv7 ~]# sed '/^$/d' user              #删除所有空行

3)sed命令的s替换基本功能(s/旧内容/新内容/选项(选项可选)):
[root@sv7 ~]# vim shu.txt        #新建素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@sv7 ~]# sed 's/2017/6666/' shu.txt     #把所有行的第1个2017替换成6666
[root@sv7 ~]# sed 's/2017/6666/g' shu.txt    #所有行的所有2017都替换成6666
[root@sv7 ~]# sed '2s/2017/6666/g' shu.txt   #第2行的所有2017都替换成6666

[root@sv7 ~]# sed 's/2017/6666/2' shu.txt    #把所有行的第2个2017替换成6666
[root@sv7 ~]# sed '1s/2017/6666/' shu.txt    #把第1行的第1个2017替换成6666
[root@sv7 ~]# sed '3s/2017/6666/3' shu.txt   #把第3行的第3个2017替换成6666
[root@sv7 ~]# sed '/2024/s/2017/6666/g' shu.txt #找含有2024的行,将里面的所有2017替换成6666

思考:如果想把 /bin/bash 替换成 /sbin/sh 怎么操作?
[root@sv7 ~]# head -1 /etc/passwd > user            #准备素材文件
[root@sv7 ~]# sed 's//bin/bash//sbin/sh/' user      #直接替换,报错
[root@sv7 ~]# sed 's/\/bin\/bash/\/sbin\/sh/' user  #使用转义符号\(屏蔽特殊符号)可以成功,但不方便
[root@sv7 ~]# sed 's,/bin/bash,/sbin/sh,' user      #最佳方案,更改s的替换符;s后面跟/,/就是替换符;s后面跟!,!就是替换符;s后面跟,那么,就是替换符
[root@sv7 ~]# sed 's(/bin/bash(/sbin/sh(' user      #替换符号可以用键盘上大部分字符

sed中的 a 和 i 和 c

a:append 行后追加
i:insert 行前插入
c:替换,替换一行内容
[root@sv7 ~]# cat user
root:x:0:0:root:/root:/bin/bash
[root@sv7 ~]# sed '1a xx' user
root:x:0:0:root:/root:/bin/bash
xx
[root@sv7 ~]# sed '1i xx' user
xx
root:x:0:0:root:/root:/bin/bash
[root@sv7 ~]# sed '1c xx' user
xx


http://www.kler.cn/a/597912.html

相关文章:

  • 安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查
  • 基于TCN-BiLSTM-Attention的序列数据预测(功率预测、故障诊断)模型及代码详解
  • 常⻅中间件漏洞--Tomcat
  • bootstrap 表格插件bootstrap table 的使用经验谈!
  • Rocky Linux 软件安装:Last metadata expiration check:
  • 某视频的解密下载
  • 潮流霓虹酸性渐变液体流体扭曲颗粒边缘模糊JPG背景图片设计素材 Organic Textures Gradients Collection
  • 1. 找不能被3、5和7整除的数并存入列表。
  • 深入理解Linux中的SCP命令:使用与原理
  • centos 7 部署ftp 基于匿名用户
  • Android 图片加载框架:Picasso vs Glide
  • LeetCode Hot 100 - 子串 | 560.和为K的子数组、239.滑动窗口最大值、76.最小覆盖子串
  • 算法设计:拒绝偷懒,追求卓越
  • 01、聊天与语言模型
  • go的hooks如何写
  • go-zero学习笔记
  • 河南大学数据库实验6
  • 为WordPress自定义一个留言板
  • Nginx请求头Hos头攻击
  • 解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题