Linux sed命令

在Linux系统中,有许多强大的文本处理工具,其中之一就是sed(Stream Editor)命令。sed是一个用于对文本进行编辑、替换、删除和过滤操作的命令行工具,一次处理一行内容。它具有强大的正则表达式支持和灵活的文本处理功能。本文将深入介绍sed命令的各种用法和功能,包括常见的文本替换、删除、插入等操作,以及正则表达式的运用。


基本语法

sed命令的基本语法如下:

sed [选项] '编辑命令' 文件名
  • 选项:sed命令支持多种选项,用于控制编辑过程。常见选项包括:-i(原地编辑)、-n(禁止默认输出)、-e(指定多个编辑命令)等。
  • 编辑命令:用于指定要对文本执行的操作,可以是替换、删除、插入等。
  • 文件名:要处理的文本文件的名称。

下面是一个简单的示例,将文本文件example.txt中的所有apple替换为orange并输出到屏幕上:

sed 's/apple/orange/' example.txt

常见选项 

  • -n 选项:禁止默认输出,只打印经过编辑的行。
sed -n '/pattern/p' filename

解释:/pattern/ 是一个正则表达式模式,sed 将搜索文件 filename 中的每一行,如果该行包含与模式匹配的文本,则使用 p 命令将该行打印到标准输出。因此,只有包含 pattern 的行会被打印。

  • -i 选项:在原始文件上进行原地编辑,将替换操作的结果直接写回文件中。
sed -i 's/old/new/' filename

解释:sed 将在 filename 文件中查找所有匹配 old 的文本,并将其替换为 new。替换操作将直接写回原始文件,而不会将结果输出到屏幕上。

  • -e 选项:允许在同一命令行上指定多个编辑命令,用于按顺序执行这些命令。
sed -e 's/old/new/' -e 's/foo/bar/' filename

解释:首先,它会查找文件 filename 中的所有匹配 old 的文本,并将其替换为 new。接下来,它会查找所有匹配 foo 的文本,并将其替换为 bar。

  • -r 选项(或-E选项,取决于sed版本):启用扩展正则表达式语法,允许更复杂的正则表达式匹配。
sed -r 's/regex/replace/' filename

解释:将查找文件 filename 中的每一行,寻找匹配 regex 的文本,并将其替换为 replace。

  • -f 选项:允许指定一个包含sed编辑命令的脚本文件,以执行复杂的编辑操作。
sed -f script.sed filename

解释:使用 -f 选项,sed 允许指定一个包含 sed 编辑命令的脚本文件 script.sed。脚本文件中可以包含多个编辑命令,它们将依次在文件 filename 上执行。

  • -s 选项:将每个输入文件视为独立的流,而不是一个连续流。
sed -s 's/World/Universe/' file1.txt file2.txt

解释:在这个示例中,-s 选项确保 sed 分别处理了 file1.txt 和 file2.txt,而不会将它们合并成一个流。因此,替换操作只应用于每个文件的内容,而不会影响其他文件。-c 选项:将替换命令视为一整个命令,而不是按行处理。

  • -u 选项:在非交互式模式下启用非缓冲输出,对于实时处理大型文件很有用。
sed -u 's/old/new/' largefile.txt

解释:在上面的示例中,-u 选项启用了非缓冲输出,允许在处理 largefile.txt 时立即查看替换结果。


编辑命令

sed 命令的编辑命令用于对文本文件进行编辑和转换。sed 编辑命令的位置通常是放在模式之后。标准的 sed 语法是先指定一个正则表达式模式,然后是编辑命令。例如:

sed '/pattern/command' filename

在这个语法中,/pattern/ 是匹配的模式,command 是要执行的编辑命令。这是 sed 的常规用法,也是大多数情况下推荐的方式。

每个编辑命令都有不同的功能,以下是一些常见的 sed 编辑命令的详细介绍,包括示例和解释:

s 命令(替换文本)

语法:s/oldText/newText/flags

功能:将每行中第一个匹配到的 old 文本替换为 new。

示例:在 example.txt 文件中,将第一个匹配到的 apple 替换为 orange。

sed 's/apple/orange/' example.txt

补充:s 命令可以附带一些标志(flags),用于修改替换操作的行为。这些标志通常放在 s 命令的最后,并用斜杠 / 分隔。以下是一些常见的 s 命令的标志:

  • g(全局替换):默认情况下,s 命令只替换每行中的第一个匹配项。如果使用 g 标志,它将替换每行中的所有匹配项。示例:s/oldText/newText/g
  • i(大小写不敏感替换):使用 i 标志进行不区分大小写的替换。示例:s/oldText/newText/i
  • n(行号匹配替换):只替换匹配到的第 n 个模式。示例:s/oldText/newText/2
  • p(打印匹配行):只打印包含匹配项的行,而不进行实际替换。示例:s/oldText/newText/p

这些标志允许你修改 s 命令的行为,以实现不同的替换操作。标志通常跟随在 s 命令之后,并用斜杠字符 /

p 命令(打印行)

语法:/pattern/p

功能:只打印(输出)包含指定正则表达式模式 /pattern/ 匹配的行。

示例:只打印包含 apple 的行,其他行不会被打印。

sed -n '/apple/p' example.txt

示例:常用的示例

sed '2p' example.txt                 # 重复打印第 2 行
sed -n '2p' example.txt              # 只打印第 2 行
sed -n '1,3p' example.txt            # 只打印第 1~3 行
sed -n '/Tom/p' example.txt          # 打印匹配到 Tom 的行,类似grep
sed -n '/Tom/!p' example.txt         # ! 反选,打印没有匹配到 Tom 的行
sed -n 's/old/new/gp' example.txt    # 只打印匹配替换的行 
sed '1,3p' example.txt               # 重复打印第1~3行

d 命令(删除行):

语法:/pattern/d

功能:删除包含指定正则表达式模式 /pattern/ 匹配的行。

示例:删除包含 apple 的行,保留其他行。

sed '/apple/d' example.txt

要删除特定行号的行,可以使用如下命令:删除第2行

sed '2d' data.txt   # 删除特定行
sed '1,4d' data.txt # 删除区间
sed 'd' data.txt    # 删除全部

a 命令(在指定行后插入文本):

语法:/pattern/a\

功能:在包含指定正则表达式模式 /pattern/ 匹配的行后插入指定的文本。

示例:在第5行之后追加新行:

sed '5a\This is an appended line' data.txt

示例:在包含 apple 的行后插入一行文本。

sed '/apple/a\
This is a new line' example.txt
# 或写成
sed '/apple/a This is a new line' example.txt

i 命令(在指定行前插入文本):

语法:/pattern/i

功能:在包含指定正则表达式模式 /pattern/ 匹配的行前插入指定的文本。

示例:在第3行之前插入新行:

sed '3i This is a new line' data.txt

示例:在包含 apple 的行前插入一行文本。

sed '/apple/i\
This is a new line' example.txt

c 命令(替换行):

语法:/pattern/c

功能:替换包含指定正则表达式模式 /pattern/ 匹配的行为指定的文本。

示例:将包含 apple 的行替换为指定的文本。

sed '/apple/c\
This line has been replaced' example.txt

示例:取代指定行(第三行):

sed '3c This line has been replaced' example.txt

y 命令(字符级别的替换)

语法:y/字符集1/字符集2/

功能:执行字符级别的替换。在输入文本中查找给定字符集的字符,替换为另一个字符集的字符。转换命令会对 字符集1 和 字符集2 值进行一对一的映射,即字符集1 的第一个字符会被转换为字符集 2 中的第一个字符。同理,第二个字符会被转换成 outchars 中的第二个字符…以此类推。这个映射过程会一直持续到处理完指定字符,将找到的所有指定字符自动进行转换。

如果 字符集1 和 字符集2 的长度不同,则 sed 会产生一条错误消息。

示例:将 file.txt 文本的小写字母替换为大写字母。

sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file.txt

w 命令(匹配的文本行写入文件)

语法:sed 'w 目标文件名' 文件名

功能:用于将匹配的文本行写入文件。通常与替换命令或匹配条件结合使用,以将满足条件的文本行写入目标文件。

示例:假设有一个名为 data.txt 的文件,内容如下:

apple
banana
cherry
date

想将其中包含 "a" 的行写入一个名为 output.txt 的文件,可以使用以下 sed 命令:

sed -n '/a/w output.txt' data.txt

运行这个 sed 命令后,output.txt 将包含所有包含 "a" 的行:

apple
banana
date

补充

反斜杠(\)在 sed 中用于换行,它允许你在多行编辑命令中换行,以提高脚本的可读性。这是因为 sed 默认将每个命令都视为一行,使用反斜杠可以将多行命令写成更清晰的形式。

在正则表达式中,反斜杠用于转义字符,使其具有特殊含义。例如,\n 表示换行字符,\t 表示制表符,\d 表示数字等。在 sed 命令中,您使用反斜杠来转义正则表达式中的特殊字符,以确保它们按照字面含义匹配。在替换部分,反斜杠也用于引用捕获的分组。

斜杠(/):在 sed 命令中,斜杠用作替换操作的分隔符,用于将搜索模式和替换模式分开。一般来说,斜杠用于分隔 s 命令的模式部分和替换部分。例如,s/abc/def/ 表示搜索 "abc" 并将其替换为 "def"。斜杠在 sed 中是一种常用的分隔符,但你也可以选择其他字符,只要它们不出现在模式或替换部分中。

分号 (;) 可以用来将编辑命令合并为一行。

sed '/apple/a This is a new line; /banana/a Another new line' example.txt

在这个示例中,我们在一行中使用了分号 (;) 来分隔两个不同的编辑命令。第一个编辑命令是在包含 apple 的行后插入一行文本,第二个编辑命令是在包含 banana 的行后插入另一行文本。这两个编辑命令在同一行上,使用分号来分隔它们,以便在一行内执行多个操作。


正则表达式

正则表达式(Regular Expression,通常缩写为"RegExp"或"regex")是一种用于匹配和操作文本的强大工具,它使用一组特殊字符和模式匹配规则来定义文本中的模式。正则表达式可以在各种编程语言和文本处理工具中使用,包括sed、awk、Python、Perl、JavaScript等等,不同编程语言和工具的正则表达式语法可能有所不同,但基本概念通常是相似的。

以下是一些常用的正则表达式元字符和示例:

  • .:匹配任何字符。
  • *:匹配前一个字符的零个或多个实例。
  • +:匹配前一个字符的一个或多个实例。
  • ?:匹配前一个字符的零个或一个实例。
  • []:定义字符类,匹配括号内的任何字符。
  • ():用于分组表达式。
  • |:用于或逻辑运算。
  • ^:匹配行的开头。
  • $:匹配行的结尾。

正则表达式的主要用途包括:

文本搜索和匹配:可以使用正则表达式来搜索文本中的特定模式,找到匹配的字符串。例如,查找电子邮件地址、URL、日期、电话号码等。

以下是一个示例:假设您有一个名为 example.txt 的文本文件,内容如下:

abcdef
abcxyzdef
123abcdef456
abcdef789

如果想匹配并打印包含 "abc" 开头和 "def" 结尾的行,可以使用以下 sed 命令:

sed -n '/^abc.*def$/p' example.txt

解释:

  • -n 选项用于关闭 sed 的默认输出,只有匹配到的行将被打印。
  • /^abc.*def$/ 是正则表达式。
  • ^ 表示文本行的开头。
  • abc 匹配 "abc"。
  • .* 匹配零个或多个任意字符。
  • def 匹配 "def"。
  • $ 表示文本行的结尾。
  • p 命令用于打印匹配到的行。

运行这个 sed 命令将输出以下结果:

abcdef
abcxyzdef

只有包含 "abc" 开头和 "def" 结尾的行被匹配和打印出来。这演示了如何在 sed 中使用正则表达式来筛选和处理文本行。

文本替换:正则表达式允许在文本中查找特定模式并将其替换为其他文本。这在数据清洗和转换中非常有用。

示例:将日期格式从 "YYYY-MM-DD" 替换为 "MM/DD/YYYY"。

sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\2\/\3\/\1/g' data.txt

这个命令的各个部分:

所以,这个 sed 命令会在 data.txt 文件中查找 "YYYY-MM-DD" 格式的日期,并将其替换为 "MM/DD/YYYY" 格式的日期,然后打印出结果。这个命令将对文件中的每个匹配执行替换操作,因为它使用了 g 标志。

数据验证:你可以使用正则表达式来验证用户输入是否符合特定格式,例如检查密码强度、验证电子邮件地址的有效性等。

示例:验证电子邮件地址的有效性。

sed -n '/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/p' data.txt

日志分析:在日志文件中查找和分析特定的事件或信息。

示例:提取日志中的错误消息。

sed -n '/ERROR/p' logfile.txt

编程语言中的字符串操作:在编程中,正则表达式可以用于字符串操作,如分割字符串、提取子字符串等。

示例:在文本中查找包含数字的子字符串。

sed -n 's/[^0-9]*\([0-9]\+\)[^0-9]*/\1/gp' text.txt

自然语言处理(NLP):正则表达式在自然语言处理中用于分词、词干提取、词性标注等。

示例:提取文本中的句子。

sed 's/\([.!?]\) /\1\n/g' text.txt

其他应用

全局搜索和替换

使用 g 标志,可以将替换操作应用于每个匹配的模式,而不仅仅是第一个。示例:

sed 's/apple/orange/g' example.txt

解释:在 example.txt 文件中,将所有匹配到的 apple 替换为 orange。

范围匹配

使用正则表达式来定义范围,例如 /start/,/end/,以匹配从 "start" 到 "end" 之间的文本块。示例:

sed -n '/start/,/end/p' example.txt

解释:打印包含 "start" 到 "end" 之间的文本块。

文本文件格式转换

sed 命令可以用于修复 Windows 格式的文本文件,使其在 Linux 或 macOS 等系统上正常显示。使其从 Windows 格式的文本文件转换为适用于 Unix/Linux 等系统的文本文件格式。

sed -i 's/\r//' test

这个命令的的作用是从名为 test 的文件中删除所有回车符 (\r),解释这个命令的各部分:

  • -i:这是 sed 命令的选项,表示在原始文件上进行 "in-place" 修改,也就是直接修改文件而不是输出到标准输出。这意味着 test 文件将被修改,删除回车符后的内容将覆盖原始文件内容。
  • 's/\r//':这是 sed 命令的 s(替换)命令。其中:
  • \r 匹配回车符。
  • // 表示将匹配到的回车符替换为空字符串,即删除它。这里的 // 只是 s/oldText/newText/ 中的 newText 部分被省略了,所以它实际上执行的是删除 oldText 部分而不进行替换。因此,它用空字符串替换匹配到的文本,实际上等同于删除匹配到的文本。

所以,这个命令的效果是在 test 文件中删除所有的回车符,使其从 Windows 格式的文本文件转换为适用于 Unix/Linux 等系统的文本文件格式。这是一个常见的文本文件格式转换操作。

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

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

相关文章

智能电表线路单回路双回路的区别

随着科技的发展和能源管理的需求,智能电表已经成为电力系统中不可或缺的一部分。智能电表可以通过数据通信网络将用电信息实时传输到电力公司,为电力公司提供更精确、实时的用电数据,同时也可以为用户提供更加智能化的用电服务。 在智能电表…

Peter算法小课堂—DP背包问题

大家好,我是Peter,我又来啦🎈🎄✨ 🎈🧨🎉《动态规划》专栏来啦,目前为止,此专栏已经有四篇文章啦🎁🎀🎄 1.DP概念与编程方法 DP概念…

图扑 HT for Web 风格属性手册教程

图扑软件明星产品 HT for Web 是一套纯国产化独立自主研发的 2D 和 3D 图形界面可视化引擎。HT for Web(以下简称 HT)图元的样式由其 Style 属性控制,并且不同类型图元的 Style 属性各不相同。为了方便查询和理解图元的 Style 属性&#xff0…

Matlab地理信息绘图—数据诊断

文章目录 数据诊断分析(均值方差)Matlab代码实现结果展示 数据诊断分析(均值方差) 均值方差检测是一种简单但有效的异常检测方法,主要基于样本的均值和方差的统计信息。该方法的核心思想是假设正常的样本点应该聚集在…

Python 自定义包和模块随机生成6位验证码(详解版)

一、新建一个包(两种方法) 方法一:先新建一个空目录命名为"小功能包",然后在新建的目录下新建一个空__init__.py(目的是声明当前目录是一个包) 方法二:直接在PyCharm用鼠标依次点击F…

多尺度retinex图像去雾算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)img_in im2doub…

基于SpringBoot的学院班级回忆录

目录 前言 一、技术栈 二、系统功能介绍 管理员模块的实现 用户信息管理 班委信息管理 班级信息管理 班级相册管理 用户和班委模块的实现 班委注册 班级信息管理 加入班级 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越…

使用c++视觉处理----canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测

使用c视觉处理canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg", cv::IMREAD_GRAYSCALE); // 转为灰度图像if (image.empty()) {std::cerr << "无法加…

2023年9月Web3行业月度发展报告区块链篇 | 陀螺科技会员专享

9月是加密市场的活动月&#xff0c;斯坦福区块链周、Token2049等大型活动相继举办&#xff0c;后者更是创下超过1万人的历史最高纪录&#xff0c;成为了全球最大的Web3活动。在本次Token2049上&#xff0c;RWA、支付以及出入金成为了讨论度最多的活动。尽管活动如火如荼&#x…

流程自动化如何帮助简化安全性

正如帮助开发 IT 安全最佳实践的政府机构 NIST 所说&#xff0c;人们越来越认识到网络安全是“每个人的工作”。换句话说&#xff0c;不仅仅是 IT 组织内的技术员工必须帮助预防和检测网络安全风险。组织中的每个人&#xff0c;包括没有技术或网络安全背景的员工&#xff0c;都…

vue elementui的select组件实现滑到底部分页请求后端接口

vue elementui的select组件实现滑到底部分页请求后端接口 1.实现效果2.实现原理 1.实现效果 老规矩&#xff0c;直接上最后的实现效果 2.实现原理 直接上代码 <el-form-item class"diagmosisItem" label"诊断" v-scroll"handleScroll">…

【C进阶】内存函数

strcpy拷贝的仅仅是字符串&#xff0c;但是内存中的数据不仅仅是字符&#xff0c;所以就有了memcpy函数 1. memcpy void *memcpy &#xff08;void * destination &#xff0c;const void * source , size_t num) 函数memcpy从source的位置开始向后拷贝num个字节的数据到desti…

如何正确的关闭Redis服务器

Redis官方原生版本是在Linux平台上开发和测试的&#xff0c;但是大多数初学者都是使用Windows系统来学习如何开发的。因此&#xff0c;官方提供了一个叫做“Microsoft Open Tech Redis”的项目&#xff0c;该项目专门为Windows平台提供了一个官方支持的Redis版本&#xff0c;但…

大数据Doris(八):启动FE步骤

文章目录 启动FE步骤 一、配置环境变量 二、​​​​​​​创建doris-mate

C/C++ 线程超详细讲解(系统性学习day10)

目录 前言 一、线程基础 1.概念 2.一个进程中多个线程特征 2.1 线程共有资源 2.2 线程私有资源 3.线程相关的api函数 3.1 创建线程 创建线程实例代码如下&#xff1a; 需要特别注意的是&#xff1a; -lpthread和-pthread的区别 3.2 给线程函数传参 传参实例代码如…

Django实现音乐网站 ⒆

使用Python Django框架做一个音乐网站&#xff0c; 本篇主要为排行榜功能及音乐播放器部分功能实现。 目录 排行榜列表 设置路由 视图处理 模板渲染 设置跳转入口 播放器功能开发 设置路由 模板页面 脚本渲染 列表渲染和播放器实现 音乐播放器列表展示关闭 总结 排…

Selenium+Pytest自动化测试框架

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高&…

百度SEO优化全攻略(提高网站排名的5个方面)

百度SEO入门介绍&#xff1a; 随着互联网的不断发展&#xff0c;SEO已经成为网站优化的重要一环。而百度作为中国最大的搜索引擎&#xff0c;其SEO优化更是至关重要。SEO不仅能够提高网站排名&#xff0c;还能够提高网站流量、用户体验以及品牌知名度。因此&#xff0c;掌握百…

代码混淆界面介绍

代码混淆界面介绍 代码混淆功能包括oc&#xff0c;swift&#xff0c;类和函数设置区域。其他flutter&#xff0c;混合开发的最终都会转未oc活着swift的的二进制&#xff0c;所以没有其他语言的设置。 代码混淆功能分顶部的显示控制区域&#xff1a;显示方式&#xff0c;风险等…

重置Mac电脑的SMC怎么操作,重置SMC方法分享~

SMC 负责管理 Mac 上的电源。重置 SMC 可以解决一些与电源或散热管理相关的不常见问题。今天重置SMC教程给大家分享一下&#xff0c;需要的小伙伴看过来&#xff01; 如何判断您是不是需要重置 SMC 若出现以下症状&#xff0c;则表明可能需要重置 SMC&#xff1a; 电池无法充电…