[转帖]使用 sed 处理文本文件
https://www.cnblogs.com/wx2020/p/16269905.html
前言
sed 是一款 GNU 流编辑器,可以按照指定的规则去处理文本文件或流,其强大的功能使用户在命令中快捷地修改文本文件成为可能。
它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:
首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行,先将处理得到的结果保存到一个暂存缓冲区中(也称为保存空间),再将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
安装
Linux(Ubuntu) 系统已经自带,mac OS系统也默认安装,Windows 需要安装一个名为 msys2 的软件,安装过程暂略。
Ps. 经搜索,Windows 也可以安装一款名为 Gow 的软件,这一款软件也含有一些简单 Linux 命令,比 msys2 更加轻量,下载地址在这里。
使用
摘要
sed [选项] [选项参数] [脚本] [输入文件] [其他参数]
基本选项及其参数
| 短选项 | 功能 | 对应长选项 |
|---|---|---|
| -n | 取消默认输出 | --quiet, --silent |
| -e 脚本 | 添加脚本至要运行的命令 | --expression=脚本 |
| -f 脚本文件 | 添加脚本文件的内容到要运行的命令 | --file=脚本文件 |
| -i [后缀] | 编辑已存在的文件。如果提供了后缀则生成指定后缀的备份文件 | --in-place[=后缀] |
| -E, -r | 在脚本中使用扩展的正则表达式 | --regexp-extended |
脚本
格式
[addr1[,addr2]][!]{命令}
地址
- 脚本中可以不指定地址,这样命令将会为输入的所有行执行
- 如果脚本给出了1个地址,那么命令将只会为匹配此地址上的行执行(单地址类型)
- 如果脚本给出了2个地址,那么命令将会对从匹配的第一个地址到第二个地址的区域的所有输入行执行 (双地址类型)
- 命令前的
!会使命令在指定地址或地址范围以外的区域执行
地址类型
单地址类型
类型描述 类型含义 number (数字) 只匹配行号为 number 的行 first~step (eg:1~2) 匹配每一个第 step 行并从 first 开始计数 $ 只匹配最后一行 /regexp/ 匹配符合正则表达式 regexp的行\a regexpb匹配符合正则表达式 regexp的行,其中的a、b为任意字符,用于辅助定位双地址类型
类型描述 类型含义 p,q (数字) 匹配从第 p 行开始到第 q 行的范围 p,+N (数字) 匹配从第 p 行开始到其之后的 N 行 p,~N (数字) 匹配第 p 行和从第 p 行开始每隔 N 行后的下一行 p, /regexp/ (p为数字,regexp为正则表达式) 匹配从第 p 行开始,直到首次发现符合正则表达式regexp的行(不含第 p 行,见注1)
注1:
- 若 p 为 0,则含义为 匹配从文件首字符开始,直到首次发现符合正则表达式regexp的行
- 若 p 为 大于 0 的行号,则 regexp 不会对第 p 行进行测试
命令
| 命令描述 | 命令含义 |
|---|---|
| a \ text | 在匹配的行后追加文本text |
| i \ text | 在匹配的行前插入文本text |
| c \ text | 用文本text替换匹配行或范围 |
| d | 删除匹配行或范围 |
| p | 输出匹配行或范围 |
| s/regexp/replacement/[替换标记] | 在匹配行或范围内,用 replacement 替换使用正则 regexp 匹配到的内容 |
注2:追加 / 插入 / 替换多行时,要在 text 内部需换行的位置用反斜杠续行。
替换标记
| 标记描述 | 标记含义 |
|---|---|
| g | 行内全面替换 |
| Ng | 行内从第N处匹配开始替换 |
| \1...\9 | 子串匹配(?) |
正则表达式元字符集
由于脚本中的命令支持正则表达式,在这就不得不提一下正则表达式的元字符集,不同的元字符在正则表达式中可以覆盖不同的匹配场景。
| 字符 | 行为描述 | 示例 |
|---|---|---|
| ^ | 行首匹配 | /^sed/匹配所有以sed开头的行 |
| $ | 行尾匹配 | /sed$/匹配所有以sed结尾的行 |
| . | 非换行符单个匹配 | /s.d/匹配s后接一个任意字符,最后是d |
| * | 0至多个字符匹配 | /*sed/匹配一个或多个空格后紧跟sed的行; /sed*/匹配se后紧跟0至多个d的行 |
| [] | 字符组内单个匹配 | /[sS]ed/匹配sed和Sed |
| [^] | 字符组外单个匹配 | /[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行 |
| \(..\) | 匹配子串,以在之后使用 | s/\(love\)able/\1rs,loveable被替换成lovers,见注3 |
| & | 匹配搜索串,以在之后使用 | s/love/ **&**/,love被替换成 **love** |
| \< | 匹配单词的开始 | /\<sed/匹配包含以sed开头的单词的行 |
| \> | 匹配单词的结束 | /sed\>/匹配包含以sed结尾的单词的行 |
| x\ | 匹配字符x,m次 | /d\{5\}/ 匹配含连续5个d的行 |
| x\ | 匹配字符x,至少m次 | /d\{5,\}/ 匹配至少含连续5个d的行 |
| x\ | 匹配字符x,至少m次,至多n次 | /d\{5,9}/ 匹配含连续5到9个d的行 |
范例
- 注释掉 build.gradle 中
implementation 'org.greenrobot:greendao:3.3.0
- 1
- 2
- 3
- 4
# 在含有 org.greenrobot:greendao:3.3.0 的行上进行替换,替换i为 //i
sed '/org.greenrobot:greendao:3.3.0/s/i/\/\/i/' build.gradle
# 替换 implementation 'org.greenrobot:greendao:3.3.0 为 在其之前加上//
sed "s/implementation 'org.greenrobot:greendao:3.3.0'/\/\/&/" build.gradle
[转帖]使用 sed 处理文本文件的更多相关文章
- sed处理文本文件
SQL文件处理在以select 开通的行的上一行添加 explain analyze 并写入文本(-i)sed -i '/^select/i\explain analyze' test_load2.l ...
- [转帖]linux sed命令
linux sed命令就是这么简单 https://www.cnblogs.com/wangqiguo/p/6718512.html 用到的最多的就是一个sed -i 's/nn/mm/' 的命令了. ...
- sed语法
Sed 命令行 以下是我们可以指定单引号在命令行sed命令的格式如下: sed [-n] [-e] 'command(s)' files 例子 考虑一下我们有一个文本文件books.txt待处理,它有 ...
- SaltStack常用的模块
目录 1. SaltStack模块介绍 2. SaltStack常用模块 2.1 SaltStack常用模块之network 2.1.1 network.active_tcp 2.1.2 networ ...
- sed命令给文本文件的每行的行首或者行尾添加文字
在每行的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每行的行尾添加字符,比如“TAIL”,命令如下: sed 's/ ...
- 利用sed把一行的文本文件改成每句一行
事实证明,至少在mac-osx上,利用sed插入一个换行符是很难的,常规的命令如: sed 's/[\.\?\!]/\n' file 是不可能的,会把那些标点符号变成n. 尝试了SO上的很多方法 ht ...
- 【转帖】vim/sed/awk/grep等文件批处理总结
vim/sed/awk/grep等文件批处理总结 https://www.cnblogs.com/cangqiongbingchen/p/9760544.html Vim相关操作 1.基础 * 和 # ...
- [转帖]linux之sed用法
linux之sed用法 https://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html docker images | awk ' ...
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ...
- sed命令详解
搜索 纠正错误 添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...
随机推荐
- 如何使用.NET在2.2秒内处理10亿行数据(1brc挑战)
译者注 在上周我就关注到了在github上有1brc这样一个挑战,当时看到了由Victor Baybekov提交了.NET下最快的实现,当时计划抽时间写一篇文章解析他的代码实现,今天突然看到作者自己写 ...
- 第五部分_Shell脚本条件判断语法结构
条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格式1: test条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] (支持正则~) ...
- 【华为云技术分享】STM32L476移植华为LiteOS系列教程------背景知识 1
一.这篇文章想向大家说明一个问题,我们开发单片机的本质是什么? 在最早的开发中,我们没有Keil.IAR等等一系列好用的单片机集成开发环境,注意这里的"集成",是指将多个软件其中有 ...
- DTT第7期直播回顾 | 低代码应用构建流程和适用场景,与你想的一样吗?
摘要:本期直播主题是<揭秘华为云低代码技术微认证>,向开发者们讲述低代码的发展历程,介绍华为低代码平台应用魔方AppCube的开发能力,解读华为低代码的认证和学习体系 本期直播详解 本期直 ...
- 训练千亿参数模型的法宝,昇腾CANN异构计算架构来了~
摘要:盘古的训练以「昇腾AI处理器」为基座,同时借助了「CANN 异构计算架构」,让硬件算力得以充分释放,大大缩短了训练时间! 2021年4月,"华为云盘古大模型"一炮走红AI人工 ...
- 面试官问:mysql中时间日期类型和字符串类型的选择
摘要:MySQL中有多种表示时间日期的数据类型,主要有YEAR.TIME.DATE.DATETIME.TIMESTAMP等 本文分享自华为云社区<一针见血,mysql中时间日期类型和字符串类型的 ...
- 火山引擎 DataTester:一次 A/B 测试,帮助产品分享率提升超 20%
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 对 C 端产品而言,增长的核心要素之一是用户活跃度.通过各类激发互动的方式,使信息得以在关系链中流转.传播,达成有效的信息 ...
- Solon:Hello world!
Solon:Hello world! (一)新建一个 maven 空项目 (二)添加 maven 引用 <dependency> <groupId>org.noear</ ...
- sort与uniq
1 sort 将文本文件内容加以排序 语法: sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>] ...
- 前端知识点 | 查看已登录网站 Cookie 信息
方法一:针对 Chrome 浏览器 设置 \(\to\) 隐私设置和安全性 \(\to\) Cookie 及其他网站数据 \(\to\) 查看所有 Cookie 和网站数据 or chrome://s ...