当前位置: 首页 > 编程日记 > 正文

s-sed(stream editor) 文本填充和编辑 基本使用

文章目录

        • 前言
        • 语法格式
        • sed 操作地址
        • sed子命令
        • sed正则表达式
        • sed使用实例
          • 打印命令 p
          • 删除命令 d
          • 替换命令 s
          • 指定操作地址的范围 逗号 ,
          • 多重编辑命令 e
          • 下行插入命令 a
          • 上行插入命令 i
          • 修改命令 c
          • 获取下一行命令 n
          • 转换命令 y
          • 退出命令 q
        • 总结

前言

sed是一个“非交互”式的字符流编辑器,能够很好得完成对多个文件的一系列编辑工作。sed提供的功能好像是交互式脚本的自然延伸,它提供的查找和替换程序可以被全局的应用于单个文件或者一组多个文件之中。

sed相对于交互式的vi/vim编辑器的优点是:

  1. sed能够在一个地方指定所有的编辑指令(查找、替换、删除、插入等),然后通过文件传递一次来执行它们。不必进入每个文件进行修改。
    vi/vim针对以上编辑指令(查找、替换、删除、插入等)则需要消耗大量的时间。

  2. sed能够保持整个文档的一致性。可以通过查找某一个特定术语的所有不同的使用方式,使得它们能够变得一致

  3. sed支持编写大量的转换程序

总结:sed能够让我们在批量处理不同模式的文件(查找、替换、删除、插入等)时更为便捷


语法格式

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

在这里插入图片描述
选项 说明

  • -n 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
  • -e 多重编辑,且命令顺序会影响结果
  • -f 指定一个 sed 脚本文件到命令行执行,
  • -r Sed 使用扩展正则
  • -i 直接修改文档读取的内容,不在屏幕上输出

sed 操作地址

sed在没有指定操作行范围时,默认操作所有行

  • number 仅仅匹配指定的行号,并进行操作;比如使用安静模式,打印某一个文件的第十行sed -n 10p test.txt
  • first~step 匹配从first起始,每隔step行匹配一次;比如sed -n 2~5p test.txt 表示从第二行开始,每隔5行打印一次,即打印:2,7,12,17…行
  • $ 匹配最后一行 sed -n '$'p test.txt
  • /REGEXP/ 这个是表示匹配正则那一行,通过//之间的正则来匹配, sed -n /[0-9]/p test.txt 匹配包含0-9中任意数字的行
  • \cREGEXPc 这个是表示匹配正则那一行,通过\c 和 c 之间的正则来匹配,c 可以是任一字符 sed -n '\m[0-9]m'p test.txt 匹配包含0-9中任意数字的行
  • 0,addr2 从首行开始,直到找到addr2,这里addr2需要为正则时,0才能够生效;类似于1,addr2从第一行开始。 其中addr2可以为数字,字符串,正则表达式;sed -n 0,/[0-9]/p test.txt ,这里addr2为正则,所以可以从0开始;
  • addr1,+N 从 addr1 这行到往下 N 行匹配,总共匹配 N+1 行;sed -n /[0-9]/,+5p test.txt 从第一个包含数字的行开始向下找5行
  • addr1,~N 从addr1这一行向下匹配,直到匹配行号中包含N的倍数即打印;sed -n /[0-9]/,~7p test.txt ,即匹配包含数字的行号开始,到某一个行号能够被7整除为止

sed子命令

sed子命令主要是操作地址指定的各个行需要执行的方式,如果没有指定操作地址,则默认执行针对所有行

  • = 打印当前筛选出来的行号 sed -n /[0-9]/,~7= test.txt,从test.txt中筛选包含数字的行,且只打印行数
  • a\ 在当前行下添加一行或者多行 sed /[0-9]/,~7a\111 test.txt 向text.txt中包含数字的指定行下添加111字符串
  • i\ 在当前行之上添加一行或者多行 sed /[0-9]/,~7i\111 test.txt 向test.txt中包含数字的指定行上添加111字符串
  • q 结束或者退出sed
  • Q 结束退出sed
  • c\ 用新文本替换(修改)当前行的文本 sed /[0-9]/,~7c\aa test.txt 用aa代替包含数字的文本
  • h 把模式空间的内容复制到暂存空间
  • H 把模式空间的内容追加到暂存空间
  • g 把暂存空间的内容复制到模式空间(用作替换指定行中指定内容的字符串)
  • G 把暂存空间的内容追加到模式空间(用作向指定行中指定内存追加字符串)
  • -l width 列出非打印字符(结束符$,width表示宽度) sed -n /[0-9]/,+7l2 test.txt
  • p 打印行
  • r 从文件中读取输入行
  • ! 对所选行之外的所有行应用命令
  • s/regexp/replacement/ 替换命令
  • d 删除行

sed正则表达式

在这里插入图片描述

sed使用实例

制造测试文件如下:top -u ceph -b -n 1|grep PID -A 10 > test.txt
在这里插入图片描述

打印命令 p

命令 p 是打印命令,用于显示模式缓存区的内容。默认情况下, sed 把输入行打印在屏幕上,同时将选定内容也打印出来,选项-n 用于取消默认打印操纵。当选项-n 和命令 p 同时出现时, sed 可打印选定的内容
sed '/27023/p' test.txt
在这里插入图片描述
sed -n '27023/p' test.txt
在这里插入图片描述

删除命令 d

命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示

sed '27023/d' test.txt 已经删除了2703所在的行,默认会将所有行打印到屏幕
在这里插入图片描述
sed '3,$d' test.txt 使用操作地址的命令,删除从第三行开始到行末的所有行
在这里插入图片描述
sed '/ceph-osd/d' test.txt 删除所有包含ceph-osd字符串的行
在这里插入图片描述

替换命令 s

替换命令s大体的格式为s/regexp/replacement/,s后的第一个字符串包含正则表达式,第二个字符串为需要替换掉的内容;可以使用g标记对行进行全部替换

  1. sed 's/ceph-osd/testsed/g' test.txt 将所有包含ceph-osd的字符串替换为testsed字符串
    在这里插入图片描述

  2. sed -n 's/^2/3/p' test.txt 将所有开头为2的字符串替换为3,并且使用-n和p命令,仅将替换的字符串打印出来
    在这里插入图片描述

  3. sed -n 's/osd$/&.sed/p' test.txt 当“与”符号( &)用在替换串中时,它代表在查找串中匹配到的内容以osd结尾时在其后增加字符串.sed
    在这里插入图片描述

  4. sed -n 's/20/ceph-sed/gp' test.txt 使用g将全局中所有包含20的字符串替换为ceph-sed
    在这里插入图片描述

  5. sed -n 's/\(ceph\)-osd/\1sed/gp' test.txt 包含在圆括号里的模式 ceph 作为标签 1 保存在特定的寄存器中。替换串可以通过\1 来引用它。则 ceph-osd 被替换为 cephsed
    在这里插入图片描述

  6. sed -n 's#20#ceph-sed#gp' test.txt sed中s之后的字符就是查找串和替换串之间的分隔符,分隔符默认为正斜杠,但其实只要任意跟在s之后的字符(换行符和反斜线除外)都可以作为分隔符。这个方法在查找包含正斜杠模式时很管用,例如查找路径名或生日
    在这里插入图片描述

指定操作地址的范围 逗号 ,

sed -n '/ceph-mon/,/ceph-mgr/p' test.txt 指定打印从ceph-mon行开始到ceph-mgr行结束
在这里插入图片描述
sed -n '5,/ceph-osd/p' test.txt 打印从第5行开始到ceph-osd所在行结束
在这里插入图片描述
sed -n '5,/ceph-osd/s/osd$/sed/gp' test.txt 从第5行开始到遇到ceph-osd字符串所在行之间,将以osd字符串结尾的行替换为以sed结尾
在这里插入图片描述

多重编辑命令 e

sed -e '1,3d' -e 's/ceph-osd/ceph-sed/g' test.txt 用于 sed 执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓存区的行上。因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。
在这里插入图片描述

下行插入命令 a

a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。
sed '/osd$/a\ hello sed' test.txt 在osd结尾的行的下面追加一行hello sed,同时hello sed前增加一个空格
在这里插入图片描述

上行插入命令 i

i命令类似于a命令,追加新的文本到文件当前行的前面。
sed '/m[a-z][a-z]$/i\ hello sed' test.txt 在以mon,mgr,mds结尾的行之上增加一行hello world
在这里插入图片描述

修改命令 c

c命令可以将已有的文本进行修改,并覆盖旧文本
sed '/m[a-z][a-z]$/c hello sed' test.txt 将mon,mgr,mds结尾的行修改为hello sed,并覆盖原来的行
在这里插入图片描述

获取下一行命令 n

n 命令表示下一条命令。 sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 sed 命令都将应用到匹配行,紧接着的下一行上
sed '/mgr$/{n;s/ceph-osd/ceph-sed/;}' test.txt 将以mgr结尾的下一行中,ceph-osd字符串替换为ceph-sed
在这里插入图片描述

转换命令 y

y 命令表示转换。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a–>A,b–>B,c–>C
sed '1,$y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test.txt 从头到位,将字符串中小写字母转换为大写字母
在这里插入图片描述

退出命令 q

sed '/mgr$/{n;s/ceph-osd/ceph-sed/;q;}' test.txt 执行到替换mgr行的下一行之后就退出,不继续打印
在这里插入图片描述

总结

sed的命令的优势不必多言,详细看到并实践到这里的伙伴们已经深有体会。在对多个文件进行批量处理的时候Sed的作用无疑是巨大省时得,但是它并不能对多个不同的模式使用同一套规则进行处理。针对不同的字符串模式,sed需要编写不同的匹配串进行处理,这个时候awk就能够华丽登场,取编写匹配规则进行文本处理。关于awk的系统性整理学习,后期将持续进行。

参考博文:
https://www.cnblogs.com/ginvip/p/6376049.html

相关文章:

c语言动态迁移mysql,flask-migrate动态迁移数据库

了解flask_migrate需要先了解flask-script,那么flask-script的作用是什么呢?flask-script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。2.执行pip install flask-script来进行安装…

软考之路-网络攻击:主动攻击和被动攻击

被动攻击(针对路上的东西下手) 概念:就是网络窃听,窃取数据包并进行分析,从中窃取重要的敏感信息 措施:防止被动攻击的主要手段是数据加密传输 主动攻击(针对计算机下手) 概念:包括窃取、篡改、假冒和破坏 措施&#x…

edge.js架起node.js和.net互操作桥梁

今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作。.net版本在4.5及以上,因为.net4.5带来的Task,asyn,await关键字和node.js的Event模型正好匹配。如果你感兴趣的话&#xff0c…

connect() failed (111: Connection refused) while connecting to upstream, cli

php-fpm没有运行 执行如下命令查看是否启动了php-fpm,如果没有则启动你的php-fpm即可 netstat -ant | grep 9000没有运行为空,有运行显示 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 启动方法 sudo /usr/loca…

C++的STL 栈实现 判断栈的出栈顺序是否合理

有这样的题目: 已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法? 类似如下: 已…

fire.php,Fire PHP

项目介绍: Fire PHP 是基于 PHP JavaScript开发的跨平台的Firefox 的扩充套件,即PHP调试插件,可以帮你debug 后端PHP 的程式,其使用的技术跟某些IDE 一样,要求你在写程式时加入一些追踪用的代码。通过使用Firephp你可以…

json_encode时中文编码转正常状态

function json_encode_cn($data) {$data json_encode($data);return preg_replace("/\\\u([0-9a-f]{4})/ie", "iconv(UCS-2, UTF-8, pack(H*, $1));", $data); }直接json_encode()函数 ["\u6fb3\u5927\u5229\u4e9e","\u8056\u8a95\u5cf6&q…

验证URL链接和IP有效性的JS代码(正则表达式)

千里之行,始于足下,因之前毕业设计的耽误,没能在博客园记录我的程序猿体会,稍有遗憾,这么多的时间,我竟让他转瞬而过!但没关系,再次出发,勿忘为什么出发! 一下…

[转帖]什么是光纤的波长?看看有哪些是你不知道的!

什么是光纤的波长?看看有哪些是你不知道的! FShttps://www.feisu.com/bbs/e-1640.html2017-07-01 00:00:001084我们平时最熟悉的光当然是我们肉眼所能看见的光。我们的眼睛对波长在400nm的紫光到700nm的红光很敏 感。但对于携带玻璃纤维的光纤&#xff0…

C++的STL 栈 实现四则运算

使用栈实现四则运算,支持,-,*,/,(,) 输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出 这个实现借用了栈以及字符处理状态机的思想: 维…

javascript小数相减会出现一长串的小数位数的原因

javascript小数相减会出现一长串的小数位数的原因 <script>var a38.8;var b6.8;alert(parseFloat(a)-parseFloat(b));var a134.22;var b6;alert(a*b);</script>以上代码为什么产生一长串小数位出来&#xff0c;虽然比较精确&#xff0c;可没必要呀。这个和数据结构…

Java孩子父母类,@Output孩子和父母之间的沟通 . 角2(5)

我正在尝试学习角度2&#xff0c;并且我正在尝试使用来自我的子组件的数据在父组件中设置变量 . 基本上我在父视图中有一个子 Headers &#xff0c;我希望 Headers 和一些HTML根据加载的子项进行更改 .父组件&#xff1a;import { Component, OnInit, ViewEncapsulation } from…

SQL 自学笔记1(W3School)

自学W3Schoolhttp://www.w3school.com.cn/sql/index.asp 简介 SQL是什么&#xff1f; Structured Query Language 结构化的查询语言 SQL能做什么&#xff1f; 面向数据库查询、取出数据、插入新数据、更新数据、删除数据在数据库中建立库、表&#xff1b;创建存储过程及视图可设…

BZOJ 1096: [ZJOI2007]仓库建设

传送门 斜率优化DP入门题 显然如果在一个位置 i 建一个仓库&#xff0c;且上一个仓库位置为 j 那么从 j1到 i 的物品显然都要存在 i 仓库是最优的 设 $f [ i ]$ 表示在第 i 个工厂建设仓库时&#xff0c;工厂 1 到 i 的物品都转移好的最小花费 考虑上一个仓库的位置 j 设工厂 i…

C++的STL 堆 实现获取数组堆第K大的数

前言 堆数据结构 使用的是优先级队列实现&#xff0c;创建堆的时候需要指定堆中元素的排列方式&#xff0c;即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章标题&#xff0c;获取一个数组中第K大的数&a…

HTML+CSS布局技巧及兼容问题【阅读季】

在IE6和IE7中&#xff0c;行高值必须大于字体的2px以上才能保证字体的完整显示或当作为链接时能显示下划线。 IE6 下去掉 input等元素 的边框 border: 0 none; 所有浏览器都可以了 边框1px {td不重叠状态}&#xff1a;border-collapse: collapse;&#xff08;table、td需同时…

php 去掉数组相同元素,php怎么去掉数组中重复的元素

php去掉数组中重复的元素的方法&#xff1a;可以通过内置函数array_unique()来实现。array_unique()函数可以移除数组中重复的值并返回过滤后的数组。如果数组中存在多个相同元素&#xff0c;则只保留第一个值。php为我们提供了专门的内置函数array_unique()来解决此问题。该函…

Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(完)...

原文 http://www.cnblogs.com/mayswind/archive/2013/04/01/2991271.html 【题外话】 这是这个系列的最后一篇文章了&#xff0c;为了不让自己觉得少点什么&#xff0c;顺便让自己感觉完美一些&#xff0c;就再把OOXML说一下吧。不过说实话&#xff0c;OOXML真的太容易 解析了&…

Makefile (2) gdb

gdb调试 1.用debug的方式编译 -g 2.打上断点 3.单步调试 step into 进入函数里面step over 运行整个函数step return 跳出当前函数 4.继续运行 5.打印和监控值 下面是栗子: 1 #include <stdlib.h>2 #include <stdio.h>3 ​4 static int add(int i) //创…

C++的 STL堆 实现获取中位数

前言 堆数据结构 使用的是优先级队列实现&#xff0c;创建堆的时候需要指定堆中元素的排列方式&#xff0c;即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数&#xff1a; 一组数排序后&#xff0c;如果元…

php 变更 obj,PHP: 不向后兼容的变更 - Manual

不向后兼容的变更PHP 核心中不向后兼容的变更以数组形式访问非数组尝试以数组方式访问 null&#xff0c;bool&#xff0c;int&#xff0c;float 或 resource(例如 $null["key"])将会抛出 notice 通知。fn 关键词fn 成为了保留关键词。需要特别注意&#xff0c;它不能…

正由另一进程使用,因此该进程无法访问此文件。

相信很多人都遇到过这样的问题吧 最近我的电脑似乎有点抽风了,不知道为什么控制台程序,只要使用 开始执行(不调试) 必然就残留在进程中 而且进程管理器看不到~~ 最恶心的是,就算重启VS也还是不能生成 经过一些尝试后发现在cmd中tasklist可以看到这个进程 这就好办了 使用taskki…

mysql5.6下主主复制的配置实现

两台虚拟机192.168.183.131和192.168.183.132,装完系统之后直接把所有开发包都装上 下载软件包mysql-5.6.10.tar.gz&#xff0c;cmake-2.8.10.2.tar.gz&#xff08;从5.5开始mysql使用cmake来进行编译了而不是之前的configure&#xff09; mysql的编译安装 1.首先安装cmake [ro…

RSA加密传输代码示例

RSA加密传输代码示例 涉及敏感数据的传输&#xff0c;双方最好约定使用加密解密。那RSA非对称加密就大有作为了。服务端可以保留自己的私钥&#xff0c;发给客户端对应的公钥。这样就可以互相加解密了。php中rsa加解密实现&#xff1a; 首先要生成一对公钥私钥。前提是linux机器…

贪心:assign cookies分糖果

贪心算法的核心&#xff1a; 遵循某种规律&#xff0c;使用最少的资源来完成目标 所以在了解贪心算法的时候需要明确两点 寻找共有的规律每一步的迭代使用最优的策略&#xff08;消耗最少的资源&#xff09; 问题如下&#xff1a; 已知一些孩子和一些糖果&#xff0c;每个孩…

mimo系统matlab,OFDM—MIMO系统的matlab程序

【实例简介】MIMO OFDM Simulator:OFDM.m: OFDM Simulator (outer function)create_channel.m: Generates a Rayleigh fading frequency-selective channel, parametrized by the antenna configuration, the OFDM configuration, and the power-delay profile.svd_decompose_c…

软件行业项目经理主要的职责是什么?(转)

项目经理职责&#xff1a;1、 基本职责就是确保项目目标的实现&#xff0c;领导项目团队准时、优质地完成全部工作。2、 与客户沟通&#xff0c;了解项目的整体需求。并与客户保持一定的联系&#xff0c;即时反馈阶段性的成果&#xff0c;和即时更改客户提出的合理需求。3、 制…

android interview 1

1. 请描述下Activity的生命周期。 必调用的三个方法&#xff1a;onCreate() --> onStart() --> onResume()&#xff0c;用AAA表示&#xff08;1&#xff09;父Activity启动子Activity&#xff0c;子Actvity退出&#xff0c;父Activity调用顺序如下AAA --> onF…

Spring Boot 的 10 个核心模块

学习 Spring Boot 必须得了解它的核心模块&#xff0c;和 Spring 框架一样&#xff0c;Spring Boot 也是一个庞大的项目&#xff0c;也是由许多核心子模块组成的。 你所需具备的基础 告诉你&#xff0c;Spring Boot 真是个牛逼货&#xff01;Spring Boot 核心配置文件详解Sprin…

贪心:Wiggle Subsequence 摇摆序列

一个整数序列&#xff0c;如果两个相邻元素的差恰好正负(负正)交替出现&#xff0c;则该序列被称为 摇摆序列。一个小于2个元素的序列直接为摇摆序列。给一个随机序列&#xff0c;求这个序列满足摇摆序列定义的最长子序列的长度&#xff1a; 输入[1,17,5,10,13,15,10,5,16,8]&…