【Shell语言学堂】sed命令最全详解

三剑客之sed

  • linux sed命令详解
    • 1.简介
    • 2.定址
    • 3.sed选项
    • 4.正则表达式元字符
    • 5.具体应用
      • 1、行打印
      • 2、替换指定文本
      • 3、插入文本行,追加文本行
      • 4、sed命令的删除功能
      • 5、其他命令
      • 6、`sed` 的分组替换功能
      • 7、sed -r或者sed -E


linux sed命令详解

CSDN@划过手的泪滴t


1.简介

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
执行时,sed会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕。
所以sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中。

sed命令的基本语法如下:

sed [options] commands [inputfile...]

2.定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

地址是一个数字,则表示行号;是“$"符号,则表示最后一行。例如:

sed -n '3p' datafile
#只打印第三行

地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:

sed '2,5d' datafile
#删除第二到第五行
sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容

3.sed选项

选项 功能
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出
-f 指定sed脚本的文件名
-i 直接编辑原文件
-l 指定行的长度
-r 在脚本中使用扩展表达式

执行多条命令的格式:

sed -e '操作1' -e '操作2' 文件
sed -n -e '/^r/p' -e '/^b/p' /etc/passwdsed -e '操作1;操作2' 文件

sed命令的操作符
在这里插入图片描述

4.正则表达式元字符

在这里插入图片描述

5.具体应用

sed命令比较适用于大的文本文件,用普通文本编辑器难以胜任的情况。下面分别介绍直接打印、插入、删除、替换等编辑操作。

1、行打印

输出缓冲区内容,使用sed的p 子命令
p子命令代表print,可以打印出sed缓冲区内的内容。
sed命令中,直接采用数字代表某个特定的文本行:'1 p’代表打印第一行;'1,3 p’代表打印1到3行;特别的,最后一行的行号为$。

不使用-n选项时,sed命令把1到3行输出了两次。这是因为不使用-n时,sed首先读取一行,并默认将缓冲区内的文本输出出来,之后p子命令再次输出。使用-n时,默认输出取消,只有p子命令的输出结果。

sed -n '1,3 p' test1.txt
sed -n '1~2 p' test1.txt
#1~2表示从第一行开始,行号递增2输出,即输出奇数行。语法格式为first~step。

打印奇数行或偶数行
方法1:

 sed -n 'p;n' test.txt  #奇数行 sed -n 'n;p' test.txt  #偶数行 

方法2:

 sed -n '1~2p' test.txt  #奇数行 sed -n '2~2p' test.txt  #偶数行 

指定打印第几行往下几行
格式:sed -n 'n,+np' 文件名

2、替换指定文本

使用s子命令
这一个命令实用性很广,并且灵活。语法也比之上面特别一些:

sed '位置参数 s/pattern/replaced/[flag]'

pattern为要替换的文本,支持正则表达式,replaced表示用来替换的一般字符串(不支持正则表达式)。

flag是替换标志,用来影响匹配替换的规则:

flag 用法

g 全局匹配,会替换文本行中所有匹配的字符串 十进制n 替换文本行中第n个匹配的字符串
p 替换第一个匹配的字符串,并且将缓冲区输出到标准输出 w 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中
缺省 替换第一个匹配的字符串

3、插入文本行,追加文本行

这两种情况很类似。插入文本使用i子命令,表示在指定位置前面插入文本;追加文本使用a子命令,表示在指定位置之后插入文本。

  • a:在下一行添加内容
sed '/添加的行/a 添加的内容' 文件名
  • i:在上一行插入内容
sed '/添加的行/i 添加的内容' 文件名

变形:y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

 sed '1,10y/abcde/ABCDE/' file

4、sed命令的删除功能

删除操作:d命令
删除空白行:

 sed '/^$/d' file

删除文件的第2行:

 sed '2d' file

删除文件的第2行到末尾所有行:

 sed '2,$d' file

删除文件最后一行:

 sed '$d' file

删除文件中所有开头是test的行:

 sed '/^test/'d file

5、其他命令

写入文件:w命令
在example中所有包含test的行都被写入file里:

 sed -n '/test/w file' example

从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:

 sed '/test/r file' filename

删除空行的三种方法

(1)grep -v “^$” 文件名#过滤出非空行
(2)cat 文件名 | tr -s\n"#压缩换行符
(3)sed '/^$/d' 文件名#删除空行

6、sed 的分组替换功能

sed 的分组替换功能允许您在正则表达式中使用圆括号 () 来捕获一组字符作为一个整体,然后在替换字符串中通过反向引用(\n,其中 n 是捕获组的编号)来引用这些被捕获的字符。下面是如何使用 sed 进行分组替换的示例:

字符串位置替换

除了使用分组进行替换外,sed 还可以直接通过字符位置来进行替换。例如,您可以使用 s 命令的子串替换功能来替换从特定位置开始的固定长度的子串。以下是一个示例:

**示例 **:将每行的第 .png 结尾的单词替换为 .jpg:

echo "This is an image.png file." | sed 's/\(\w*\).png/\1.jpg/g'

这里,\(\w*\) 匹配并捕获一个或多个单词字符(字母、数字或下划线),直到遇到 “.png”。替换字符串 \1.jpg 使用反向引用 \1 引用捕获的单词字符,将 “.png” 替换为 “.jpg”。

示例 2:将每行的第五个到第七个字符替换为 “XYZ”:

echo "0123456789ABCDEF" | sed 's/^\(....\)\(...\)/\1XYZ/g'

这里,^\(....\)\(...\) 匹配行首的前四个字符(\(....\))作为第一捕获组,接着匹配并捕获接下来的三个字符(\(...\))作为第二捕获组。替换字符串 \1XYZ 保留第一捕获组的内容,并将第二捕获组的内容替换为 “XYZ”。

综上所述,sed 提供了分组和基于位置的替换功能,可以根据不同的需求灵活应用这些功能来修改文本内容。

1.分组替换字符
sed ‘$r 123.txt’ test.txt #先读取123.txt内容,然后再到test.txt的末行插入读取的所有内

echo bbxx | sed -r 's/(bb)(xx)/\2\1/'

在这里插入图片描述

echo 你喜欢我 | sed -r 's/(.)(.)(.)(.)/\4\2\3\1/'

7、sed -r或者sed -E

sed -r 是 sed 命令的一个选项,用于启用扩展(extended)正则表达式(ERE)。在某些 sed 实现中(如 GNU sed),使用 -r 或 -E 选项可以使 sed 解析器接受扩展正则表达式的语法,相比基本正则表达式(BRE),扩展正则表达式提供了更丰富、更直观的正则表达式语法。

在您提到的场景——将文件中的所有连续空格替换为单个空格——中,使用 -r 选项并非必需,因为该任务可以使用基本正则表达式轻松完成。不过,如果您已经习惯使用扩展正则表达式的语法,也可以在命令中加入 -r 选项:

sed -r 's/ +/ /g' file > output_file

这里的替换命令 s/ +/ /g 与之前的基本正则表达式版本 s/ + / /g 功能相同,都是查找并替换所有连续的空格为单个空格。主要区别在于:

在扩展正则表达式中,连续空格的表示方式更为简洁,不需要在重复量词(+)前加反斜杠进行转义。
使用 -r 选项后,其他扩展正则表达式的特性(如 | 表示逻辑或、() 用于分组等)也可以在 sed 命令中直接使用,而无需额外的反斜杠转义。
总之,sed -r 是一个开启扩展正则表达式支持的选项,使得 sed 命令能够理解并处理扩展正则表达式的语法。在实际使用时,根据个人习惯和具体需求选择是否启用该选项。对于替换连续空格的任务,无论是否使用 -r 选项,都可以得到相同的结果。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「51媒体」如何有效进行媒体邀约,提升宣传传播效果?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 进行有效的媒体邀约,提升宣传传播效果的关键在于策略性和专业性。以下是具体的做法: 明确目标:要确立清晰的品牌推广目标和策略,包括确定目…

【程序分析】5-6 数据流分析基础

目录 数据流分析迭代的结束点就是到达了一个函数的不动点 偏序 上界和下界、上确界和下确界 上界和下界 上确界和下确界 一些性质 格 半格 全格 product lattice 数据流分析和格 数据流分析的几个问题 第一问 第二问 第三问 lattice 上的单调性 lattice 不动点…

优惠券布局的最终方案------css属性mask

先贴图&#xff1a; 以上这些都是通过mask去实现出来&#xff1a; <!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

009Node.js自定义模块通过exports的使用(一)

module/tool.js function formatApi(api){return "http://www.shixiaobin.com/"api } exports.formatApiformatApi;app.js //引入http模块 const httprequire(http);const toolsrequire(./module/tools.js);console.log(tools);http.createServer(function (req,res…

基于STM32的RFID智能门锁系统

本文针对RFID技术&#xff0c;着重研究了基于单片机的智能门锁系统设计。首先&#xff0c;通过链接4*4按键模块与主控STM32&#xff0c;实现了多种模式&#xff0c;包括刷卡开锁、卡号权限管理、密码开锁、修改密码、显示实时时间等功能。其次&#xff0c;采用RC522模块与主控S…

1231: 寻找出现次数最多的数

解法&#xff1a; #include<iostream> #include<algorithm> #include<vector> #include<unordered_map> #include<utility> using namespace std; int main() {int n, a;cin >> n;unordered_map<int, int> mp;while (n--) {cin >…

解决:IDEA编译报错,自动切换JDK编译版本

一、IDEA切换JDK版本 要想在IDEA中完成对JDK版本的切换有多个地方需要我们进行修改 File | Settings | Build, Execution, Deployment | Compiler | Java Compiler File->ProjectStruct->platform settings->SDKS File->ProjectStruct->projectSettings->…

FreeRTOS_day1

1.总结keil5下载代码和编译代码需要注意的事项 下载代码前要对仿真进行设置 勾选后代码会立刻执行 勾选后会导致代码不能执行 写代码的时候要写在对应的begin和end之间&#xff0c;否则会被覆盖 2.总结STM32Cubemx的使用方法和需要注意的事项 ①打开软件&#xff0c;新建工程…

免费HTTPS证书获取攻略

申请SSL证书可简化为以下三个步骤&#xff1a; 第一步&#xff1a;选择证书类型与提供商 - 确定网站需求&#xff0c;选择合适的SSL证书类型&#xff08;如DV、OV、EV&#xff09;。 - 选取信誉良好的证书颁发机构&#xff08;CA&#xff09;。 永久免费SSL证书_永久免费htt…

深度学习知识点:卷积神经网络(CNN)

深度学习知识点&#xff1a;卷积神经网络&#xff08;CNN&#xff09; 前言卷积神经网络&#xff08;CNN&#xff09;卷积神经网络的结构Keras搭建CNN经典网络分类LeNetAlexNetAlexNet 对比LeNet 的优势&#xff1f; VGGVGG使用2个33卷积的优势在哪里&#xff1f;每层卷积是否只…

代码学习记录44---动态规划

随想录日记part44 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.16 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;两个字符串的删除操作 &#xff1b;编辑距离 &#xff1b;编辑距离总结篇 583. 两…

GPT-4 都已经这么强了,那未来的 GPT-5 会是什么样子?

GPT-4 可以说是再一次颠覆了我对 AI 的认知&#xff0c;从文本到图片视频&#xff0c;再到逻辑推理&#xff0c;简直是神进步。 GPT5上线前夕&#xff0c;把GPT4慢慢弄成GPT3.5的效果&#xff0c;把GPT3.5逐渐弄成GPT3的效果&#xff0c;GPT5横空出世的时候就如GPT4对GPT3.5的…