Shell之sed
sed是什么
Linux sed 命令是利用脚本来处理文本文件。 可依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed命令详解
语法
sed [-hnV][-e <script>][-f<script文件>][文本文件]
sed [-nefr] [动作]
参数
-e<script>或–expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-h或–help 显示帮助。
-n或–quiet或–silent 仅显示script处理后的结果。
动作
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行取代的工作。通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g
高级子命令
高级子命令比较少,但是比较复杂,平时用的也会相对少些,却也很重要,有的内容处理不用高级子命令是完成不了的。
n:读入下一行到模式空间,例:’4{n;d}’ 删除第5行。
N:追加下一行到模式空间,再把当前行和下一行同时应用后面的命令。
P:输出多行模式空间的第一部分,直到第一个嵌入的换行符位置。在执行完脚本的最后一个命令之后,模式空间的内容自动输出。P命令经常出现在N命令之后和D命令之前。
D:删除模式空间中第一个换行符的内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用与模式空间剩余的内容。这3个命令能建立一个输入、输出循环,用来维护两行模式空间,但是一次只输出一行。
例子1:
sed 'N;$!P;D' a.txt
#说明:删除文件倒数第二行
例子2:
sed 'N;! P ; !P;!P;!D;$d' a.txt
例子
#在 testfile 文件的第四行后添加一行
sed -e 4a\newLine testfile
#将 testfile 的内容列出并且列印行号,同时,请将第 2~5 行删除!
nl testfile | sed '2,5d'
#要删除第 3 到最后一行:
nl testfile | sed '3,$d'
#第二行后(即加在第三行) 加上test 字样
nl testfile | sed 'test'
#第二行前 加上test 字样
nl testfile | sed '2i drink tea'
#要增加两行以上,在第二行后面加入两行字,例如 test0 与 test1?
nl testfile | sed '2a test0\
test1'
#取代2到5行的内容
nl testfile | sed '2,5c No 2-5 number'
#列出 testfile 文件内的第 5-7 行
nl testfile | sed -n '5,7p'
#搜索 testfile 有 oo 关键字的行
nl testfile | sed -n '/oo/p'
#删除 testfile 所有包含 oo 的行,其他行输出
nl testfile | sed '/oo/d'
#数据的搜寻并执行命令
#搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo 替换为 kk,再输出这行。最后的 q 是退出。
nl testfile | sed -n '/oo/{s/oo/kk/;p;q}' #数据的查找与替换
#除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的查找与替换。sed 的查找与替换的与 vi 命令类似,语法格式如下:
sed 's/要被取代的字串/新的字串/g'
#将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准输出:
sed -e 's/oo/kk/' testfile
#g 标识符表示全局查找替换,使 sed 对文件中所有符合的字符串都被替换,修改后内容会到标准输出,不会修改原文件:
sed -e 's/oo/kk/g' testfile
#选项 i 使 sed 修改文件:
sed -i 's/oo/kk/g' testfile
#批量操作当前目录下以 test 开头的文件:
sed -i 's/oo/kk/g' ./test*#样本 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
#将 IP 前面的部分予以删除:
/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
#将 IP 后面的部分予以删除:
/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'#多点编辑
一条 sed 命令,删除 testfile 第三行到末尾的数据,并把 HELLO 替换为 test
nl testfile | sed -e '3,$d' -e 's/HELLO/test/'#直接修改文件内容
#sed 将 regular_express.txt 内每一行结尾若为.则换成!
sed -i 's/\.$/\!/g' regular_express.txt
#利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:
sed -i '$a # This is a test' regular_express.txt
#把hello换成A保存到file.txt,同时会以file.txt.bak文件备份原来未修改文件内容,以确保原始文件内容安全性,防止错误操作而无法恢复原来内容。
sed –i.bak 's/hello/A/' file.txt
echo “hello world” | sed -r 's/(hello)|(world)/A/g'
#将第2-4行中hello字符串替换为A,其它行如果有hello也不会被替换。
sed –n '2,4s/hello/A/' message
#从第2行开始,再接着往下数4行,也就是2-6行,这些行会把hello字符替换为A。
sed –n '2,+4s/hello/A/' message
#第4行开始,到第6行。解释6的由来,"4,~3"表示从4行开始到下一个3的倍数,这里从4开始算,那就是6了,当然9就不是了,因为是要求3的第一个超过前边数字4的倍数
sed –n '4,~3s/hello/A/' message
#从第4行开始,每隔3行就把hello替换为A。比如从4行开始,7行,10行等依次+3行。这个比较常用,比如3替换为2的时候,也就是每隔2行的步调,可以实现奇数和偶数行的操作。
sed –n '4~3s/hello/A/' message
#!符号表示取反,该命令是将除了第1行,其它行hello替换为A,上述定址方式也可以使用!符号
sed -n '1!s/hello/A/' message
#将匹配到nihao的行执行删除操作。
sed -n '/nihao/d' message
#删除空行
sed -n '/^$/d' message
#说明:匹配以TS开头的行到TE开头的行之间的行,把匹配到的这些行删除。
sed -n '/TS/,/TE/d' message
#匹配从第1行到TS开头的行,把匹配的行删除
sed -n '1,/^TS/d' message
#将从TS开头的行到TE开头的行之间范围的行内容中CN替换为China,并且把Beijing替换为BJ,类似于多命令之间用分号的那种方式,不过这样定址代码只写了一遍,相当于执行了一条子命令。
/TS/,/TE/{
s/CN/China/
s/Beijing/BJ/
}
sed -n `2,3s{/cn/china/;/a/b/}` message
#将message文件中1-2行的下边分别添加3行,3行内容分别是A、B、C,这里使用了\n,插入多行内容都可以按照这种方式来实现。
sed `1,2a A\nB\nC` messagecat message
hello 123 world
#将message每行包含的第一个hello的字符串替换为HELLO,这是最基本的用法。
sed 's/hello/HELLO/' message
#用了扩展正则表达式,需要加-r选项。结果:A
sed -r 's/[a-z]+ [0-9]+ [a-z]+/A/' message
#结果:hello 123 world
sed -r 's/([a-z]+)( [0-9]+ )([a-z]+)/\1\2\3/' message
#\1表示正则第一个分组结果,\2表示正则匹配第二个分组结果,\3表示正则匹配第三个分组结果。结果:world 123 hello
sed -r 's/([a-z]+)( [0-9]+ )([a-z]+)/\3\2\1/' message
# &表示正则表达式匹配的整个结果集。结果:hello 123 world
sed -r 's/([a-z]+)( [0-9]+ )([a-z]+)/&/' message
#在匹配结果前后分别加了111、222。结果:111hello 123 world222
sed -r 's/([a-z]+)( [0-9]+ )([a-z]+)/111&222/' message
#在message文件中每行的首尾分别加上111、222。
sed -r 's/.*/111&222/' message
#把message文件中每行的所有i字符替换为A,默认不加g标记时只替换每行的第一个字符。
sed 's/i/A/g' message
#把message文件中每行的第2个i字符替换为A。
sed 's/i/A/2' message
#加-p标记会把被替换的行打印出来,再加上-n选项会关闭模式空间打印模式,因此该命令的效果就是只显示被替换修改的行。
sed -n 's/i/A/p' message
#把message文件中内容的每行第一个字符i替换为A,然后把修改内容另存为b.txt文件。
sed -n 's/i/A/w b.txt' message
#把message文件中每一行的第一个i或I字符替换为A字符,也即是忽略大小写。
sed -n 's/i/A/i' message#删除文件每行的第二个字符。
sed -r 's/(.*)(.)$/\1/'
#删除文件每行的最后一个字符。
sed -r 's/(.*)(.)$/\1/'
#删除文件每行的倒数第2个单词。
sed -r 's/(.)([a-Z]+)([a-Z]+)([a-Z]+)([a-Z]+)([^a-Z]$)/\1\2\4\5/' /etc/passwd
#交换每行的第一个字符和第二个字符。
sed -r 's/(.)(.)(.*)/\2\1\3/' /etc/passwd
#交换每行的第一个单词和最后一个单词。
sed -r 's/([a-Z]+)([a-Z]+)(.*)([a-Z]+)([a-Z]+)([^a-Z]*$)/\5\2\3\4\1\6/' /etc/passwd
#删除一个文件中所有的数字。
sed 's/[0-9]//g' /etc/passwd
#用制表符替换文件中出现的所有空格。
sed -r 's/ +/\t/g' /etc/passwd
#把所有大写字母用括号()括起来。
sed -r 's/([A-Z])/(\1)/g' /etc/passwd
#打印每行3次。
sed 'p;p' /etc/passwd
#隔行删除
sed '0~2{=;d}' /etc/passwd
#把文件从第22行到第33行复制到56行后面。
sed '22h;23,33H;56G' /etc/passwd
#把文件从第22行到第33行移动到第56行后面。
sed '22{h;d};23,33{H;d};56g' /etc/passwd
#只显示每行的第一个单词。
sed -r 's/([a-Z]+)([^a-Z]+)(.*)/\1/' /etc/passwd
#打印每行的第一个单词和第三个单词。
sed -r 's/([a-Z]+)([a-Z]+)([a-Z]+)([a-Z]+)([a-Z]+)([^a-Z]+)(.*)/\1\t\5/' /etc/passwd
#将格式为mm/yy/dd的日期格式换成 mm;yy;dd
date `+%m/%y/%d' | sed 's///;/g'
相关文章:
Shell之sed
sed是什么 Linux sed 命令是利用脚本来处理文本文件。 可依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 sed命令详解 语法 sed [-hnV][-e <script>][-f<script文件>][文本文件] sed [-nefr] [动作…...

AJAX——认识URL
1 什么是URL? 统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器、定位地址、URL地址)俗称网页地址,简称网址,是因特网上标准的资源的地址&…...
《Docker极简教程》--Docker环境的搭建--在Linux上搭建Docker环境
更新系统:首先确保所有的包管理器都是最新的。对于基于Debian的系统(如Ubuntu),可以使用以下命令:sudo apt-get update sudo apt-get upgrade安装必要的依赖项:安装一些必要的工具,比如ca-certi…...

开源微服务平台框架的特点是什么?
借助什么平台的力量,可以让企业实现高效率的流程化办公?低代码技术平台是近些年来较为流行的平台产品,可以帮助很多行业进入流程化办公新时代,做好数据管理工作,从而提升企业市场竞争力。流辰信息专业研发低代码技术平…...
C#系列-C#操作UDP发送接收数据(10)
在C#中,发送UDP数据并接收响应通常涉及创建两个UdpClient实例:一个用于发送数据,另一个用于接收响应。以下是发送UDP数据并接收响应的示例代码: 首先,我们需要定义一个方法来发送UDP数据,并等待接收服务器…...
突破编程_C++_面试(基础知识(10))
面试题29:什么是嵌套类,它有什么作用 嵌套类指的是在一个类的内部定义的另一个类。嵌套类可以作为外部类的一个成员,但它与其声明类型紧密关联,不应被用作通用类型。嵌套类可以访问外部类的所有成员,包括私有成员&…...

初步探索Pyglet库:打造轻量级多媒体与游戏开发利器
目录 pyglet库 功能特点 安装和导入 安装 导入 基本代码框架 导入模块 创建窗口 创建控件 定义事件 运行应用 程序界面 运行结果 完整代码 标签控件 常用事件 窗口事件 鼠标事件 键盘事件 文本事件 其它场景 网页标签 音乐播放 图片显示 祝大家新…...

【npm】安装全局包,使用时提示:不是内部或外部命令,也不是可运行的程序或批处理文件
问题 如图,明明安装Vue是全局包,但是使用时却提示: 解决办法 使用以下命令任意一种命令查看全局包的配置路径 npm root -g 然后将此路径(不包括node_modules)添加到环境变量中去,这里注意,原…...

Go 语言 for 的用法
For statements 本文简单翻译了 Go 语言中 for 的三种用法,可快速学习 Go 语言 for 的使用方法,希望本文能为你解开一些关于 for 的疑惑。详细内容可见文档 For statements。 For statements with single condition 在最简单的形式中,只要…...

熵权法Python代码实现
文章目录 前言代码数据熵权法代码结果 前言 熵权法做实证的好像很爱用,matlab的已经实现过了,但是matlab太大了早就删了,所以搞一搞python实现的,操作空间还比较大 代码 数据 import pandas as pd data [[100,90,100,84,90,1…...

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决
ERR_SSL_KEY_USAGE_INCOMPATIBLE报错原因 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。这意味…...
使用深度学习进行“序列到序列”分类
目录 加载序列数据 定义 LSTM 网络架构 测试 LSTM 网络 此示例说明如何使用长短期记忆 (LSTM) 网络对序列数据的每个时间步进行分类。 要训练深度神经网络以对序列数据的每个时间步进行分类,可以使用“序列到序列”LSTM 网络。通过“序列到序列”LSTM 网络,可以对…...
Python和Java的区别(不断更新)
主要通过几个方面区分Python和Java,让大家有一个对比: 语言类型 Java是一种静态类型、编译型语言。 Python是一种动态类型、解释型语言,注重简洁和灵活的语法。 语法 在Java中,变量需要显式地声明,指定其类型。例如&am…...

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)
八、ui窗体创建要点 .h文件定义(popwindowf.h), TEST_TYPE_WINDOW宏是要创建的窗口样式。 #pragma once #include <gtk/gtk.h> G_BEGIN_DECLS #define TEST_TYPE_WINDOW (test_window_get_type()) G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WI…...

vue electron 应用在windows系统上以管理员权限打开应用
打开package.json文件,在build下的win增加配置 "requestedExecutionLevel": "requireAdministrator",...
c实现链表
目录 c实现链表 链表的结构定义: 链表的结构操作: 1、初始化链表 2、销毁链表 3、插入结点 4、输出链表数据 5、查找链表数据 扩展 代码实现 c实现链表 链表的结构定义: /*** 链表结构定义 ***/ typedef struct Node {int data; //…...

力扣231. 2 的幂(数学,二分查找,位运算)
Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1:位运算 1.易验证2的幂为正数; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2:数学 当给定数n大于1时…...

Maven私服部署与JAR文件本地安装
Nexus3 是一个仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取 maven 仓库资源的时候,都是从 maven 的官方(或者国内的镜像)获取。团队的多人员同样的依赖都要从远程获取一遍,从网络方…...

【MySQL】字符串函数的学习
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

AI助力农作物自动采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建作番茄采摘场景下番茄成熟度检测识别计数分析系统
去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物,专家设计出来了很多用于采摘不同农作物的大型机械,看着非常震撼,但是我们国内农业的发展还是相对比较滞后的࿰…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...