Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)

news2024/12/26 12:05:40


0 前言


在大数据时代,我们要面对大量数据,有时需要对数据进行替换、删除、新增、选取等特定工作。

在Linux中提供很多数据处理命令,如果我们要以行为单位进行数据处理,可以使用sed。

1 sed 的帮助信息,功能,格式,选项和参数说明,退出状态

1.1 sed 的帮助信息

我们可以使用命令sed--help来获取帮助信息。

1.1.1 CSDN程序员研究院bash中的sed 的帮助信息

[purpleendurer @ bash ~] sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression=script
                 add the script to the commands to be executed
  -f script-file, --file=script-file
                 add the contents of script-file to the commands to be executed
  --follow-symlinks
                 follow symlinks when processing in place
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)
  -c, --copy
                 use copy instead of rename when shuffling files in -i mode
  -b, --binary
                 does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
                 open files in binary mode (CR+LFs are not treated specially))
  -l N, --line-length=N
                 specify the desired line-wrap length for the `l' command
  --posix
                 disable all GNU extensions.
  -r, --regexp-extended
                 use extended regular expressions in the script.
  -s, --separate
                 consider files as separate rather than as a single continuous
                 long stream.
  -u, --unbuffered
                 load minimal amounts of data from the input files and flush
                 the output buffers more often
  -z, --null-data
                 separate lines by NUL characters
  --help
                 display this help and exit
  --version
                 output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret.  All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
[purpleendurer @ bash ~]

1.1.2 银河麒麟(kylin)系统中的sed帮助信息

[purpleendurer @kylin-bash ~] sed --help
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

  -n, --quiet, --silent
                 取消自动打印模式空间
  -e 脚本, --expression=脚本
                 添加“脚本”到程序的运行列表
  -f 脚本文件, --file=脚本文件
                 添加“脚本文件”到程序的运行列表
  --follow-symlinks
                 直接修改文件时跟随软链接
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)
  -l N, --line-length=N
                 指定“l”命令的换行期望长度
  --posix
                 关闭所有 GNU 扩展
  -r, --regexp-extended
                 在脚本中使用扩展正则表达式
  -s, --separate
                 将输入文件视为各个独立的文件而不是一个长的连续输入
  -u, --unbuffered
                 从输入文件读取最少的数据,更频繁的刷新输出
  -z, --null-data
                 separate lines by NUL characters
      --help     打印帮助并退出
      --version  输出版本信息并退出

如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为
sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
输入读取数据。

GNU版sed主页: <http://www.gnu.org/software/sed/>。
使用GNU软件所需帮助文档: <http://www.gnu.org/gethelp/>。
将错误报告通过电子邮件发送到:<bug-sed@gnu.org>.
请务必将单词“sed”放在标题的某处。
[purpleendurer @kylin-bash ~] 

1.2 sed的功能

sed命令源于stream editor(流编辑器),是一个非交互式命令行文本编辑器。

sed命令的功能主要是对文本进行过滤,例如,接受文本输入,对文本执行一些操作(或一组操作),并输出修改后的文本。

sed命令在处理文本时,会先把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾

sed命令的强大之处在于能够处理大文件,并使用正则表达式进行模式匹配和替换,这使其成为脚本编写和数据整理的必备工具。

sed命令通常用于使用模式匹配提取文件的一部分,或替换文件中多次出现的字符串。

当您需要在文件或流上高效地执行文本转换时,可以使用 sed。

1.3 sed的格式

sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

1.4 sed的选项说明 

选项说明
-n, --quiet, --silent取消自动打印模式空间
-e 脚本, --expression=脚本

将脚本添加到要执行的命令中。

即:直接在命令行模式上进行sed动作编辑,此为默认选项

-f 脚本文件, --file=脚本文件

将指定脚本文件的内容添加到要执行的命令中。

即:将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

--follow-symlinks直接修改文件时跟随软链接
-i[SUFFIX], --in-place[=SUFFIX]

就地编辑文件(如果提供了 SUFFIX,则进行备份)

当使用-i选项时,要注意它可能对文件进行不可逆的修改。

在处理重要数据时,务必确保进行备份。

-c, --copy在 -i 模式下随机播放文件时,使用复制而不是重命名
-b, --binary什么都不做;与 WIN32/CYGWIN/MSDOS/EMX 兼容(以二进制模式打开文件(CR+LF 未得到特殊处理))
-l N, --line-length=N为 'l' 命令指定所期望的换行长度
--posix关闭所有 GNU 扩展
-r, --regexp-extended在脚本中使用扩展正则表达式
-s, --separate将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered从输入文件加载最少的数据量,并更频繁地刷新输出缓冲区
-z, --null-data用 NUL 字符来分隔行
--help打印帮助并退出
--version输出版本信息并退出

1.5 sed的参数

如果没有给出 -e、--expression、-f 或 --file 选项,则第一个非选项 参数作为要解释的 sed 脚本。 

如果在处理上述操作后仍有任何命令行参数,则这些参数将被解释为要处理的输入文件的名称。

文件名“-”是指标准输入流。如果未指定文件名,则将处理标准输入。

1.6 sed的退出状态

退出状态为零表示成功,非零值表示失败。

GNU sed 返回以下退出状态值:

退出码说明
0成功完成。
1无效的命令、无效的语法、无效的正则表达式或与 --posix 一起使用的 GNU sed 扩展命令。
2

无法打开命令行上指定的一个或多个输入文件(例如,如果找不到文件,或读取权限被拒绝)。

继续处理其他文件。

4如果出现 I/O 错误,或者在运行时出现严重的处理错误,GNU sed 会立即中止。

此外,命令 q 和 Q 可用于使用自定义退出代码值终止 sed(这是一个 GNU sed 扩展),详见2.1。

2 sed的脚本

sed 脚本程序由一个或多个 sed 命令组成,这些命令由 -e、-f、--expression 和 --file 选项中的一个或多个传入,如果不存在以上这些选项,则由第一个非选项参数传入。

sed命令的脚本命令格式如下:

[地址]X[选项]


其中:

1.X :是一个单字母的 sed 文本处理命令。

2.[地址] :是可选的行地址。如果指定了 [地址],则命令 X 将仅在匹配的行上执行。[地址] 可以是单行号、正则表达式或一系列行。

3. [选项]: 用于某些 sed 命令。

3 sed命令

3.1 sed命令说明

命令说明
a\在当前行下面插入文本
i\在当前行上面插入文本
c\把选定的行改为新的文本
d删除,删除选择的行
D删除模板块的第一行
s替换指定字符
h拷贝模板块的内容到内存中的缓冲区
H追加模板块的内容到内存中的缓冲区
g获得内存缓冲区的内容,并替代当前模板块中的文本
G获得内存缓冲区的内容,并追加到当前模板块文本的后面
l列表不能打印字符的清单
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
p打印模板块的行
P打印模板块的第一行
q[exit-code] 退出 sed,而不处理任何其他命令或输入。
Q[exit-code]

此命令与 q 相同,但不会打印模式空间的内容。

与 q 一样,它提供了向调用者返回退出代码的功能。

b lable分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
r file从file中读行
t labelif分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
T label错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
w file写并追加模板块到file末尾
W file写并追加模板块的第一行到file末尾
!表示后面的命令对所有没有被选定的行发生作用
=打印当前行号
#把注释扩展到下一个换行符以前;

3.2 替换标记

替换标记说明
g表示行内全面替换
p表示打印行
w表示把行写入一个文件
x表示互换模板块中的文本和缓冲区中的文本
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1子串匹配标记
&已匹配字符串标记

3.3 元字符 

元字符说明
^匹配行开始,如:/^sed/匹配所有以sed开头的行
$匹配行结束,如:/sed$/匹配所有以sed结尾的行
.匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d
*匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行
[]匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed
[^]匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行
\(..\)匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers
&保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**
\<匹配单词的开始,如:/\
\>匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行
x\{m\}重复字符x,m次,如:/0\{5\}/匹配包含5个0的行
x\{m,\}重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行
x\{m,n\}重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行

4 sed命令中的地址

sed命令中的地址用于决定对流入模式空间的哪些行进行编辑。

如果没有指定地址,sed将处理流入模式空间的所有行。

地址可以使用以下方式指定。

4.1 数字

sed 脚本中的地址可以采用以下任何形式:

表达式说明
行号

指定行号将仅匹配输入中的该行。

请注意,除非指定了 -i 或 -s 选项,否则 sed 会连续计算所有输入文件的行数。

$此地址与最后一个输入文件的最后一行匹配,或者在指定 -i 或 -s 选项时匹配每个文件的最后一行。
第一步~步长

这个 GNU 扩展匹配从第一行开始的每一步行。特别是,当存在非负 n 时,将选择行,使得当前行号等于第一个 + (n * 步长)。

因此,我们可以使用 1~2 来选择奇数行,使用 0~2 来选择偶数行;

要选择从第二行开始的每三行,将使用“2~3”;

要选择从第十行开始的每五行,请使用“10~5”;

而“50~0”只是50的一种晦涩难懂的说法。

4.2 文本匹配(正则表达式)

sed 支持以下正则表达式地址。默认正则表达式为基本正则表达式 (BRE)。

如果使用 -E 或 -r 选项,则正则表达式应采用扩展正则表达式 (ERE) 语法。

表达式说明
/正则表达式/

这将选择与正则表达式正则表达式匹配的任何行。

如果正则表达式本身包含任何 / 字符,则每个字符都必须通过反斜杠 (\) 进行转义。  

空正则表达式 '//' 重复上次正则表达式匹配(如果将空正则表达式传递给 s 命令,则同样适用)。请注意,正则表达式的修饰符是在编译正则表达式时计算的,因此将它们与空正则表达式一起指定是无效的。

\%regexp%

% 可以替换为任何其他单个字符。

这也与正则表达式正则表达式匹配,但允许使用与 / 不同的分隔符。

如果正则表达式本身包含大量斜杠,这将特别有用,因为它避免了每个 / 的繁琐转义。

如果正则表达式本身包含任何分隔符,则每个分隔符都必须用反斜杠 (\) 进行转义。

/regexp/I

\%regexp%I

正则表达式匹配的 I 修饰符是一个 GNU 扩展,它使正则表达式以不区分大小写的方式进行匹配。

在许多其他编程语言中,小写字母 i 用于不区分大小写的正则表达式匹配。但是,在 sed 中,i 用于插入命令

/regexp/M

\%regexp%M

正则表达式匹配的 M 修饰符是一个 GNU sed 扩展,它指示 GNU sed 在多行模式下匹配正则表达式。修饰符使 ^ 和 $ 分别匹配(除了正常行为)换行符之后的空字符串和换行符之前的空字符串。有一些特殊字符序列(\' 和 \')始终与缓冲区的开头或结尾匹配。此外,在多行模式下,句点字符与换行符不匹配。

0,/regexp/

可以在地址规范中使用 0 的行号,例如 0,/regexp/,以便 sed 也将尝试匹配第一输入行中的正则表达式。换句话说,0,/regexp/ 类似于 1,/regexp/,不同之处在于,如果 addr2 匹配输入的第一行,则 0,/regexp/ 形式将认为它结束范围,而 1,/regexp/ 形式将匹配其范围的开头,从而使范围跨度直到正则表达式的第二次出现。

请注意,这是 0 地址唯一有意义的地方;没有第 0 行,以任何其他方式给出 0 地址的命令都会产生错误。

addr1,+N

匹配 addr1 和 addr1 后面的 N 行。

addr1,~N

匹配 addr1 和 addr1 后面的行,直到输入行号是 N 的倍数的下一行。

正则表达式地址对当前模式空间的内容进行操作。如果模式空间发生变化(例如,使用 s/// 命令),则正则表达式匹配将对更改的文本进行操作。      

4.3 范围地址

可以通过指定两个用逗号 (,) 分隔的地址来指定地址范围。

5 参考资料

sed, a stream editorsed, a stream editoricon-default.png?t=N7T8https://www.gnu.org/software/sed/manual/sed.html

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

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

相关文章

Golang | Leetcode Golang题解之第352题将数据流变为多个不相交区间

题目&#xff1a; 题解&#xff1a; type SummaryRanges struct {*redblacktree.Tree }func Constructor() SummaryRanges {return SummaryRanges{redblacktree.NewWithIntComparator()} }func (ranges *SummaryRanges) AddNum(val int) {// 找到 l0 最大的且满足 l0 < val…

opencv-python图像增强十一:文档阴影去除

文章目录 一&#xff0c;简介二&#xff0c;方案简述三&#xff0c;算法实现流程&#xff1a;3.1 闭运算提取背景&#xff1a;3.2 背景减除获取文字 四&#xff0c;整体代码&#xff1a;五&#xff0c;效果: 一&#xff0c;简介 图像阴影是光学现象的一种&#xff0c;当物体遮…

从文本到向量:Weaviate在RAG中的应用案例

探索向量数据库在RAG中的应用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;向量数据库如Weaviate正变得越来越流行&#xff0c;因为它们为文本数据的管理和检索提供了强大的支持。特别是&#xff0c;它们在实现Retrieval-Augmented Generation&#xff08;R…

无人机适航证取证技术详解

随着无人机技术的飞速发展和广泛应用&#xff0c;无人机的安全性与适航性成为了全球航空领域关注的焦点。无人机适航证作为衡量无人机是否符合安全飞行标准的重要凭证&#xff0c;其取证过程涉及技术、法规、测试等多个方面。本文旨在深入解析无人机适航证取证技术&#xff0c;…

算法的学习笔记—顺时针打印矩阵(牛客JZ29)

&#x1f600;前言 在算法的学习过程中&#xff0c;二维数组的操作是一个非常重要的内容&#xff0c;其中顺时针打印矩阵是一个经典的问题。这个问题不仅考察我们对矩阵的理解&#xff0c;还要求我们具备较强的逻辑思维能力。本文将详细解析如何通过Java代码来实现这一功能。 &…

SpringBoot响应式编程(3)R2DBC

一、概述 1.1简介 R2DBC基于Reactive Streams反应流规范&#xff0c;它是一个开放的规范&#xff0c;为驱动程序供应商和使用方提供接口&#xff08;r2dbc-spi&#xff09;&#xff0c;与JDBC的阻塞特性不同&#xff0c;它提供了完全反应式的非阻塞API与关系型数据库交互。 …

c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

目录 前言&#xff1a; 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱…

AIoT智能物联网平台定义

随着科技的飞速发展&#xff0c;我们正步入一个由智能设备和互联网络构成的新时代。AIoT&#xff0c;即人工智能物联网&#xff08;Artificial Intelligence of Things&#xff09;&#xff0c;是这个时代的标志性产物。本文旨在探讨AIoT智能物联网平台的定义、核心组件、应用场…

wordpress站群搭建6外部库的引入和测试

wordpress站群搭建6wordpress外部库的引入和测试 本次目标我们主要讲解引入wordpress外部库并测试。 我们将一些外部库和工具包放入到pkg项目&#xff0c;方便其他项目引用。 1.安装go-wordpress库 进入到pkg项目 go get github.com/robbiet480/go-wordpress2.编写工具类 …

22 交换机双工模式

交换机双工模式 一、双工模式 &#xff08;一&#xff09;单工、半双工、全双 ​ 单工&#xff1a; ​ 只有一个信道&#xff0c;传输方向只能是单向的 ​ 半双工&#xff1a; ​ 只有一个信道&#xff0c;在同一时刻&#xff0c;只能是单向传输 ​ 全双工&#xff1a; …

【JavaEE】深入MyBatis:动态SQL操作与实战项目实现指南

目录 MyBatis的进阶操作动态SQL<if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 练习表白墙数据准备引⼊MyBatis 和 MySQL驱动依赖配置MySQL账号密码编写后端代码测试 图书管理系统数据库表设计引⼊MyBatis 和MySQL 驱…

阿里QuickBI实战

目录 引言数据采集、数据治理、数据分析举例资金在经济社会的流通性 概述数据分析的常见问题数据分析的痛点 QuickBI 产品架构图主功能链路数据建模与数据分析的关系使用场景1、搭建报表看板&#xff1a;仪表盘2、中国式报表工具&#xff1a;电子表格3、企业CXO驾驶舱&#xff…

网络工程3(子网通信,为什么要使用mac和ip)

文章目录 一. 子网如何通讯1. 子网内部通信2. 子网外部通信 二. 交换机和路由器的连接三. 为什么不只使用mac地址或ip地址进行网络通信1. 首先要明确的是&#xff0c;不管是只用mac或只用ip通信 四. 子网设备如何获得ip五. 不同网段的主机无法直接通信的原因 一. 子网如何通讯 …

GAMES101——作业7 路径追踪 (含提高:多线程,微平面理论)

任务 castRay(const Ray ray, int depth)in Scene.cpp: 在其中实现 Path Tracing 算法 可能用到的函数有&#xff1a; intersect(const Ray ray)in Scene.cpp: 求一条光线与场景的交点 sampleLight(Intersection pos, float pdf) in Scene.cpp: 在场景的所有光源上按面积…

用 CWE API 减轻软件产品中的安全风险

1. CWE REST API 推出的目的 8 月 8 号&#xff0c;CWE™ 计划推出了“CWE REST API”。 CWE™计划由美国网络安全与基础设施安全局(Cybersecurity & Infrastructure Security Agency(CISA))资助的国土安全系统工程与发展研究所(Homeland Security Systems Engineering a…

AutoSAR SecOC小小科普

目录 1.为什么要提SecOC 2.SecOC基本原理 2.1 参与到MAC计算的数据有哪些 2.2 新鲜度值如何管理 3.SecOC与各模块关联关系 1.为什么要提SecOC 在车载网络技术里&#xff0c;大家基本都是从CAN开始入门。在CAN DBC里&#xff0c;我们总能看到有些报文除了自带有效payload外…

AWS 消息队列服务 SQS

AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例&#xff1a;如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据&#xff0c;数据发送方和数据消费方是通过什么方式来无缝集成消费数据的&#xff0c;AWS 提供 SQS 消息队列服务来解决…

42000 Star图标工具Mermaid!

Mermaid&#xff1a;用文本构建图表世界 - 精选真开源&#xff0c;释放新价值。 概览 Mermaid.js 是一个创新的开源工具&#xff0c;专为简化图表创建流程而设计。它通过一种简洁的文本描述语言&#xff0c;使得用户能够快速地生成流程图、序列图、甘特图等图表&#xff0c;而…

【威锋网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

JavaEE过滤器的创建与使用过滤器的使用场景

过滤器 Filter也称之为过滤器&#xff0c;过滤器是javaEE规范肿定义的一种技术,可以让请求到达目标servlet之前,先进入到过滤器中,在过滤器中统一进行一些拦截处理,当处理完成后,可以继续向后执行,到达目标servlet,如果配置了多个过滤器,也可以进入下一个过滤器 创建过滤器 创…