Linux sed流编辑器

news2024/11/28 1:37:37

sed流编辑器

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

sed 的工作流程主要包括读取、执行和显示三个过程

•读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
•执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
•显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

sed 处理大文件很卡怎么办(面试题)

  1. 用cat 输出 | 交给sed (这时就不通过IO一行行读文件,而是cat一次性读取完成 再缓存中直接取)
    cat 文件 | grep / sed / awk
  2. split切块文件 for循环依次读取执行

目录

sed流编辑器

sed 处理大文件很卡怎么办(面试题)

sed命令示例

 打印内容

 输出行号

打印不可见字符 

 同时使用多个操作符

使用地址

打印指定行

 退出sed

 显示奇数行

使用文本输出匹配的行

多条件根据文本筛选

行号 字符串 配合使用

删除行

指定行号

正则表达式 

删除空行的三种方法

行号 字符串 配合使用

替换 

正则表达式 替换

 sed文件中读取命令执行

 保存修改结果

避免路径 / 被误判为分隔符 /         使用  \   或是  直接修改分隔符

插入

替换行

转换字符

行前行后 插入行

读取其他文件内容插入当前文件

保持空间 实现复制剪切

剪切效果

复制效果

分片重组



sed命令格式

sed -e 'n{
操作1
操作2
...
}' 文件1 文件2 ...

常用选项

-e 或--expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或--help:显示帮助。
-n、--quiet 或 silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i:直接修改目标文本文件。
sed -e '操作' 文件1 文件2 ...  
-e 指定操作字符

sed -n -e '操作' 文件1 文件2 ...
-n 不显示

sed -f 脚本文件 文件1 文件2 ...
-f 调用文本文件中的命令

sed -i -e '操作' 文件1 文件2 ...
-i 会修改文件内容

常用操作

s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
c:替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同,对应替换,类似tr命令替换用法。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用,避免输出两次。
n:移动到下一行
=:打印行号。
l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
q:跟上数字(例如5q) 指定第几行输出后退出流编辑器


sed命令示例

 打印内容

sed -n -e 'p' testfile1 #-n不显示结果 -e指定操作字符 'p'显示结果
cat festfile | sed -n -e 'p' #先cat输出再sed 同义
cat festfile | sed -n 'p' #只有一个操作符的情况可以省略-e

 输出行号

sed -n -e '=' testfile1   # '='输出行号
cat festfile | sed -n '=' | tail -l #输出最后一行行号(统计行数)
cat festfile | wc -l #更简单的统计行数

打印不可见字符 

sed -n -e 'l' testfile1 #'l'打印不可见字符

 同时使用多个操作符

sed -n -e '=;p' testfile1  #同时打印行号和内容的3种写法 ; 分隔操作符

sed -n -e '=' -e 'p' testfile1 #同时打印行号和内容的3种写法 每个操作符一个-e

sed -n '  #同时打印行号和内容的3种写法 回车分批输入
> =
> p
> ' testfile1

sed -n '=  
> p
> ' testfile1


使用地址

sed编辑器有2种寻址方式:
1、以数字形式表示行区间
2、用文本模式来过滤出行

打印指定行

sed -n '4p' testfile1 #打印第四行
sed -n '$p' testfile1 #打印末尾行
sed -n '1,3p' testfile1 #打印1-3行      !需要加-n屏蔽原来的输出不然默认从第一行输出到最后一行!
sed -n '3,$p' testfile1 #打印3行到最后行
sed -n '3p;$p' testfile1 #打印3行和最后行
sed -n '1,+3p' testfile1    #打印1之后的连续3行,即1-4行

 退出sed

sed '5q' testfile1            #打印前5行信息后退出,q表示退出

 显示奇数行

sed -n 'p;n' testfile1        #打印奇数行 
第一行p显示行。第二行n跳过一行到第三行。第三行显示,第四行不显示...

sed -n 'n;p' testfile1        #打印偶数行

sed -n '2,${n;p}' testfile1   #第二行开始,执行n;p,输出一行跳过一行(3 5 7 9 11...)

sed -n '3 {p;n;n;p}' testfile1   #✨在第三行执行 输出 换行两次 输出(3 5)
sed -n '3,${p;n;n;p}' testfile1  #✨在第三行到最后一行执行 输出 换行两次 输出(3 5 6 8 9...)

传统的for循环写法
a=0
for i in $(cat ./testfile1)
do
    let a++
    if [ $[a%2] -eq 1 ];then
        echo "$i 奇数行"
    else
        echo "$i 偶数行"
    fi
done

使用文本输出匹配的行

sed -n '/root/p' /etc/passwd  #显示包含root的行    /文字/p(显示)

sed -n '/^root/p' /etc/passwd #添加正则表达式 root开始的行
sed -n '/bash$/p' /etc/passwd #添加正则表达式 bash结尾的行

多条件根据文本筛选

sed -n -e '/ftp/p' -e '/root/p' /etc/passwd #筛选既有root又有ftp的行

sed -nr '/ftp|root/p' /etc/passwd  #合并写法 加上-r 使用扩展正则表达式

sed -n '/ftp\|root/p' /etc/passwd  #合并写法 加上 \

行号 字符串 配合使用

sed -n '2,/nobody/p' /etc/passwd #从第二行开始,到第一个包含nobody的行结束

sed -n '2,/nobody/=' /etc/passwd #显示‘从第二行开始,到第一个包含nobody的行结束’的行号

sed -nr '/ro?t/p' /etc/passwd #-r表示支持扩展正则表达式 ?匹配一次前面的内容(o)
sed -nr '/ro+t/p' /etc/passwd #-r表示支持扩展正则表达式 +匹配一次或多次前面的内容(o)
sed -nr '/ro*t/p' /etc/passwd #-r表示支持扩展正则表达式 +匹配0次或多次前面的内容(o)
sed -nr '/ro{1,}t/p' /etc/passwd #-r表示支持扩展正则表达式 {1,}匹配一次或多次前面的内容(o)
sed -n '/ro\{1,\}t/p' /etc/passwd #若不加-r代表扩展正则表达式 需要加上 \ 

删除行

指定行号

sed 'd' testfile1       #全删(因为流编辑器一行行执行,代表每行都执行删除)
sed '3d' testfile1      #删除3行
sed '2,4d' testfile1    #删除2-4行

正则表达式 

sed '$d' testfile1      #删除最后一行
sed '/^$/d' testfile1   #删除空行 ^$(开头结尾 表示空行)

sed '/nologin$/d' /etc/passwd  #删除nologin结尾行
sed '/nologin$/!d' /etc/passwd #“!”表示取反操作

删除空行的三种方法

grep -v "^$"
tr -s '\n'
sed '/^$/ d'

行号 字符串 配合使用

sed '2,/3/d' testfile2 #从第二行开始删到第一个包含3的行

sed '/1/,/3/d' testfile2  #从第一个包含2的行开启删除功能 删到第一个包含3的行 关闭删除功能

注意,使用字符串匹配删除,会寻找第一个包含字符串(1)位置的行 开启删除功能 删除到第二个包含字符串(3)位置的行 关闭删除功能
若接下来的匹配中又遇到了包含第一个字符串(1)位置的行,还会
继续开启删除功能,直到遇到第二个包含字符串(3)位置的行 关闭删除功能。(若没有则一删到底)

根据字符串匹配删除不够准确 容易误删 最好还是指定行号进行删除

替换 

行范围 s/旧字符串/新字符串/替换标记

                        4种替换标记
数字:替换行内第x个被匹配到的字符串
g:替换所有匹配的字符串
p:打印被替换的行,与-n一起使用
w 文件:将替换的结果写到文件中
sed -n 's/root/admin/p' /etc/passwd #将行内第一个root替换成admin p输出替换的行 -n不显示所有行

sed -n 's/root/admin/2p' /etc/passwd #将行内第二个匹配到的root替换成admin

sed -n 's/root/admin/gp' /etc/passwd #行内所有root替换成admin

sed -n 's/root//gp' /etc/passwd #删除行内所有root(替换为空)

正则表达式 替换

sed -n 's/^#//p' /etc/passwd #去除注释,开头#替换为空 -n不输出文件 p输出更改结果
sed '1,20 s/^/#/' /etc/passwd #1-20行 行首[空]替换为[#] (添加注释#)

sed '/^root/ s/$/#/' /etc/passwd #root开头行 末尾加上#
sed '/root/ s/^/#/' /etc/passwd  #包含root行 末尾加上#

sed '/swap/ s/^/#/' /etc/fatab #注释掉etc/fatab中自动挂载的swap分区 开头加上#

sed -rn 's/.*root.*/#&/p' /etc/passwd  #直接写正则用s替换,不用传统写法,比较麻烦这种写法
# /.*root.*/  包含root的行  (.*   .代表匹配任意一个字符 *代表匹配前面的表达式0次或多次)  
#   #&中 &表示前面正则表达式匹配到的内容 #在匹配到内容前加上#号

 sed文件中读取命令执行

sed -f script.sed /etc/passwd #从script.sed文件中读取sed命令执行

script.sed文件内容
/^root/ s/^/#/ #注释 root开头行 开头加上#
s/ftp/mysed/g  #ftp 全部 替换为mysed
/nologin$/ d   #删除nologin结尾行

 保存修改结果

方法1 重定向输出 (保存所有)
sed '1,20 s/^/#/' /etc/passwd > new.txt #1-20行 添加注释# 并且重定向输出
方法1 重定向输出 (只保存修改的行内容)
sed -n '1,20 s/^/#/p' /etc/passwd > new.txt #-n不输出全部 p输出修改内容

方法2 w命令(只保存修改的行内容)
sed '1,20 s/^/#/w new.txt' /etc/passwd  #1-20行 添加注释# 并且保存
sed '1,20w out.txt' /etc/passwd #1-20行保存

避免路径 / 被误判为分隔符 /         使用  \   或是  直接修改分隔符

sed -n 's/\/bin\/bash/\/sbin\/nologin/p' /etc/passwd 
#/bin/bash改为/sbin/nologin 需要加\避免系统误判/路径为/分隔符
#'s/   \/bin\/bash   /   \/sbin\/nologin   /p'

上面的写法可读性差,可以直接替换分隔符 
只需要任意字符紧跟替换符号 s 后,就会将这个字符识别为分隔符
sed -n 's!/bin/bash!/sbin/nologin!p' /etc/passwd  #使用“!”作为字符串分隔符
sed -i 's9\945\9\99\98\939g' test.txt #将94599替换为9893 并i写入文件 \9代表普通字符 9代表分隔符
# 's9   \945\9\9   9   \98\93   9g' [ \9为用 \ 取消9的分隔符含义,表示普通9字符 ]


插入

替换行

sed '1c hello world' testfile1  #第一行整行替换为 hello world
sed '10c hello world' testfile1 #第十行整行替换为 hello world
sed '$c hello world' testfile1  #最后行整行替换为 hello world

sed '/45/c ABC' testfile2 #包含45的行替换为ABC

转换字符

sed 'y/our/ABC/' testfile2   #使所有的o字符转换成A,所有的u字符转换成B,所有的r字符转换成C

行前行后 插入行

行前插入
    #根据行号
sed '1a 123' testfile1 #在第一行后插入123行(第二行:123)
sed '$a 123' testfile1 #在最后一行后插入123行(追加效果)
sed '1,3a 123' testfile1 #1-3行后都插入123
    #根据字符串匹配
sed '/^t/a 123' testfile1 #匹配t开头的行 在行后插入123

行后插入
    #根据行号
sed '1i 123' testfile2 #在第一行前插入123行(第一行:123)
sed '$i 123' testfile2 #在最后一行前插入123行
sed '1,3i 123' testfile2 #1-3行前都插入123
    #根据字符串匹配
sed '/^t/i 123' testfile1 #匹配t开头的行 在行前插入123

读取其他文件内容插入当前文件

sed '5r /etc/resolv.conf' testfile2 #在第5行后追加插入/etc/resolv.conf文件内容
sed '$r /etc/resolv.conf' testfile2 #在最后行后追加插入/etc/resolv.conf文件内容

保持空间 实现复制剪切

        

        sed除了缓冲空间用于逐行处理,还有一个保持空间,可以用于保持存储信息。

剪切效果

sed '/root/{H;d};$G' /etc/passwd    
#将包含root的行剪切到末尾 H复制到剪切板d删除(结合实现剪切) 
#G表示粘贴到指定行后 $G粘贴到最后一行

sed '1,3{H;d};$G' /etc/passwd            
#将1、2行剪切 粘贴到最后一行下面
粘贴到最后一行后可能遇到文件末尾换行符,加上sed '/^$/d' 删除空行
sed '1,3{H;d};$G' /etc/passwd | sed '/^$/d'

sed '1,3{H;d};10,$G' /etc/passwd  #剪切1-3行 10-最后行每行粘贴

        在vi编辑器中在:命令模式中输入✨   1,3 m 10      把1-3行剪切到10行后

复制效果

sed '1,2H;3,4G' /etc/passwd            
#将1、2行复制 粘贴到3和4行的下面(3 4行每行后都会加上1 2行内容)

sed '1,3H;$G' /etc/passwd            
#将1、2行复制 粘贴到最后一行下面
复制到最后一行后可能遇到文件末尾换行符,加上sed '/^$/d' 删除空行
sed '1,3H;$G' /etc/passwd | sed '/^$/d'

sed '1,3H;10,$G' /etc/passwd  #复制1-3行 10-最后行每行粘贴

         在vi编辑器中在:命令模式中输入✨   1,3 co 10     把1-3行复制到10行后

分片重组

先( )指定分片 再\指定每个分片位置重组

echo "111222333" | sed -r 's/(111)(222)/\2\1/'    #-r使用扩展正则表达式
#将字符 111 和 222 互换位置

echo "111222333" | sed -r 's/(111)(222)(333)/\3\2\1/'    #-r使用扩展正则表达式
#将字符 111 和 222 互换位置

首尾字符交换
echo "111222333" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'        
#第一个字符 最后一个字符 交换
# 's/^(.)(.*)(.)$    ^(.)第一个任意字符 (.*)任意字符任意次 (.)$最后一个任意字符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能的本质人工智能与机器人领域的64个大问题阅读笔记(二)

目录 如果一个人不能理解所说语言的全部信息,那么说这种语言也是没有意义的。 “20年内,机器将能够胜任人类承担的所有工作”(赫伯特西蒙, 1965)。 以及21世纪的人类愿意相信超智能机器时代的到来,与前几…

项目中大批量数据查询导致OOM

项目中有时候一次性将大批量数据都查出来到内存中导致内存占用过多很可能会导致内存溢出 问题复现 搭建一个本地项目。需求描述:查询表call_task中待拨打的数据进行拨打,call_task中一次可能会有大批量数据需要处理。本次准备了1万条数据。 /*** 查询…

【Java校招面试】基础知识(九)——Redis

目录 前言一、基础概念二、Redis持久化三、Redis分布式存储后记 前言 本篇主要介绍Redis数据库的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第九篇博文,如有需要,可: 点击这里,返回本专栏的索引文章点…

(c语言实现)数据结构链表oj题(2)

前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:分析力扣中有关链表的部分题目. 目录 前言一、链表中倒…

HTML第二天

第二天 表格 表格的主要作用 1.表格主要用于显示、展示数据,因为它可以让数据显示的非常的规整,可读性非常好。特别是后台展示数据的时候,能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理2.表格不是用来…

Java基础知识:1,DOS命令

1,盘名称 加 : 进入该盘目录下 例如:e: 进入e盘 2,dir 查看当前路径下文件和文件夹 3,md 文件夹名字 》 创建文件夹(md后要加空格) (md make directory) 4,c…

Oracle11g下载与安装

一、Oracle11g下载 官网下载地址:Oracle Database 11g Release 2 for Microsoft Windows (x64) 选择"Accept License Agreement",点击"win64_11gR2_database_1of2.zip"和"win64_11gR2_database_2of2.zip",进行…

Debian11之 K3s 部署K8S集群

K3S 架构方案 Server 节点指的是运行 k3s server 命令的主机,control plane 和数据存储组件由 K3s 管理Agent 节点指的是运行 k3s agent 命令的主机,不具有任何数据存储或 control plane 组件Server 和 Agent 都运行 kubelet、容器运行时和 CNI 基于 …

GPUAnimation的Mesh动画烘焙到贴图,学习笔记

0.动画烘焙贴图工具作者 Unity-GPU Animation - 知乎 1.安装学习项目 GitHub - striter/Unity3D-ToolChain_StriteR 复制到URP项目中,并删掉多余报错的和GPUAnimation无关的模块 2.把学习项目中的HLSL搬到低版本Unity的CG版本 安装FBX Exporter把烘焙好的mesh导…

【秒杀系统】高并发编程入门学习

文章目录 一、秒杀系统的基本构成二、秒杀系统的常见问题三、秒杀系统的解决技术 一、秒杀系统的基本构成 二、秒杀系统的常见问题 高并发 大量的请求进来,在Redis缓存层会发生缓存雪崩 缓存击穿 缓存穿透这些问题,这些问题就会打挂MySQL。这样就会导致…

23种设计模式之建造者模式(Builder Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的建造者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

C++ STL 之 list 的模拟实现

文章目录 📍前言🌈STL之list的模拟实现🎈list_node节点的定义🎈iterator迭代器🕯️构造函数🕯️*it🕯️->🕯️it/it🕯️it--/--it🕯️! / 🎈l…

[MAUI程序设计]界面多态与实现

文章目录 需求一:在不同设备上使用不同 UI 外观定义控件 UI 外观基于平台自定义配置 需求二:在不同数据类别中使用不同的 UI 外观定义视图 UI 外观创建数据模板创建选择器定义数据 需求三:在不同数据状态中使用不同的 UI 外观使用绑定模型更改…

【腾讯云FinOps Crane 集训营】Crane 助力云原生用户充分发挥云上资源的最大价值,帮助企业降本增效之利器

文章目录 Crane 助力云原生用户充分发挥云上资源的最大价值,帮助企业降本增效之利器前言云上资源成本虚高的现状一、云原生的崛起:服务上云二、服务上云的魔咒:服务健壮了,钱袋子却空了三、钱都去哪了:云资源无序投入的…

golang 微服务的负载均衡

上次我们说了一下 微服务的容错处理,是用的 断路器 这一次我们来一起看看 微服务的负载均衡是如何做的 负载均衡 负载均衡是什么呢? 他能够将大量的请求,根据负载均衡算法,将不同的请求分发到多台服务器上进行处理&#xff0c…

Git Mac设置系统命令别名和Git命令别名

有时候git命令的别名过长要如何,在命令行不方便输入,这时候我们可以设置命令别名。 设置系统命令别名 设置系统命令别名可以在.bash_profile文件中配置,这个文件也是我们经常配置环境变量的地方,这个文件本身是不可见的&#xf…

rtp h264 发送和接收程序的问题

目的 为了自己写一个投屏协议,目前重新启用rtp协议,使用rtp协议直传效率最高,并且使用的是udp ffmpeg 发送rtp ffmpeg的rtp发送时一般把sps和pps放在一个包里面,写接收代码的时候要注意,在单包里面可以直接接收到两…

第一章: Mybatis-Plus 之了解

目录 1.1:Mybatis-Plus介绍 1.2:代码及文档地址 1.3:特性 1.4:架构 1.5:作者 下面的图文来自于官方的介绍 1.1:Mybatis-Plus介绍 Mybatis-Plus 是一个 Mybatis 的增强工具,在Mybatis的基…

Seata之 Win系统和 Linux系统搭建

文章目录 1 Seata搭建1.1 Linux环境搭建1.1.1 准备工作1.1.2 下载1.1.3 建表1.1.4 配置 nacos1.1.4.1 新建命名空间1.1.4.2 上传配置至Nacos配置中心1.1.4.3 不上传而使用配置 1.1.5 修改 appplication.yml1.1.5.1 seata.store1.1.5.2 seata.config1.1.5.3 seata.registry 1.1.…

多模态:InstructBLIP

多模态:InstructBLIP IntroductionMethoddatasetInstruction-aware 视觉提取架构Dataset Balance 实验参考 Introduction 作者表示,与nlp任务不同,多模态任务由于引入额外的视觉输入,它的任务更加多样化,这似的联合多…