【sed】进阶
- N:将数据流的下一行加入当前模式空间
- D:删除多行组中的一行
- P:打印多行组中的一行
# cat data1.txt
this is the header line this is the data line this is the last line
经n命令处理后可跳过第一行:
# sed '/header/{n;d}' data1.txt
this is the header line
this is the data line
this is the last line
# cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
# sed '/first/{N;s/\n/ /}' data2.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line.
Tips:使用N命令可查找分散在两行的文本。注意最后一行进入模式空间,执行N命令由于没有后续的可读入行,会导致后面的命令无法执行。
# cat data5.txt This is the header line.
This is a data line. This is the last line.
# sed '/^$/{N ; /header/D}' data5.txt
This is the header line.
This is a data line.
This is the last line.
Tips:这种办法可实现删除特殊行,比如需要同时满足两种条件的行。
# sed -n '/header/{N;P}' data5.txt
This is the header line.
|
命令
|
描述
|
|
h
H
g
G
x
|
将模式空间复制到保持空间
将模式空间附加到保持空间
将保持空间复制到模式空间
将保持空间附加到模式空间
交换模式空间和保持空间
|
# sed -n '/first/ {h ; p ; n ; p ; g ; p }' data2.txt
This is the first data line.
This is the second data line.
This is the first data line.
# sed -n '/header/p' data2.txt
This is the header line.
普通p命令打印匹配文本行,使用!后,效果相反,不打印该行而打印其它行:
# sed -n '/header/!p' data2.txt
This is the first data line.
This is the second data line.
This is the last line.
结合保持空间反转文本行的顺序:
# sed -n '{1!G ; h ; $p }' data2.txt
This is the last line.
This is the second data line.
This is the first data line.
This is the header line.
Tips:sed编辑器默认会将命令循环应用在每一行文本上,因此合理使用命令,可写出简洁高效的sed脚本
# sed '{2,3b ; s/This is/Is this/ ; s/line./test?/}' data2.txt
Is this the header test?
This is the first data line.
This is the second data line.
Is this the last test?
加address,加label,分支匹配处的行跳到标签处,执行标签后的命令;不匹配的行执行所有命令:
# sed '/first/b jump1 ; s/This is the/No jump on/; :jump1 ; s/This is the/Jump here on/' data2.txt
No jump on header line.
Jump here on first data line.
No jump on second data line.
No jump on last line.
不加address,b命令无条件跳转到标签上,可造成循环的效果:
# echo "This, is, a, test, to, remove, commas." | sed -n '{:start;s/,//1p;b start}'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
^C
该脚本不会停止循环,可使用/,/b start代替b start,在没有逗号时自动结束循环。
# sed 's/first/matched/; t ; s/This/Here/' data2.txt
Here is the header line.
This is the matched data line.
Here is the second data line.
Here is the last line.
加label,跳转到label处:
# echo "This,is,a,test,to,remove,commas." | sed -n '{:start ; s/,/ /p ; t start}'
This is,a,test,to,remove,commas.
This is a,test,to,remove,commas.
This is a test,to,remove,commas.
This is a test to,remove,commas.
This is a test to remove,commas.
This is a test to remove commas.
# sed 's/first/matched/; t ;s/This/Here/;s/line/LINE/' data2.txt
Here is the header LINE.
This is the matched data line.
Here is the second data LINE.
Here is the last LINE.
# sed 's/first/matched/; t jump ;s/This/Here/; :jump ;s/line/LINE/' data2.txt
Here is the header LINE.
This is the matched data LINE.
Here is the second data LINE.
Here is the last LINE.
Tips:使用标签和t命令可在脚本命令中形成循环
# echo "The cat sleeps in his hat." | sed 's/.at/"&"/g'
The "cat" sleeps in his "hat".
【替代单独的单词】
# echo | sed ':start;s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;t start'
,,
Tips:圆括号必须转义
【sed】进阶的更多相关文章
- 第11章:sed进阶操作
第11章:sed进阶操作 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为 ...
- 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶
本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...
- sed进阶N;P;D
案例 sed 的高级替换 $cat file1 why:1 why:2 3 4 5 why:6 why:7 8 why:9 $cat file2 why:1 why:2 3 4 5 why:6 why ...
- sed进阶教程
寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...
- sed进阶
下面这些命令未必经常会用到,但当需要时,知道这些肯定是件好事. 一.多行命令 sed命令通常是对一行数据进行处理,然后下一行重复处理. sed编辑器包含了三个可用来处理多行文本的特殊命令 N:将数据流 ...
- 文本处理工具——sed进阶
一sed的搜索替代 (一)常见的和替代相关的选项 搜索替代,和vim的写法很像 s///:查找替换,支持使用其它分隔符,s@@@,s### p: 显示替换成功的行,就是打印. w /PATH/TO/S ...
- Shell编程—sed进阶
1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行 ...
- sed命令总结-Linux
sed命令总结-Linux linuxsed 2018年02月08日 19时27分57秒 命令语法经常忘记,每次总是看笔记不切实际,记不起来的要多查manual,本次总结按照manual总结,希望下次 ...
- 两个有用的shell工具总结
shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...
- 《Linux命令行与shell脚本编程大全 第3版》
第一部分 Linux 命令行 第1章 初识Linux she1.1 什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...
随机推荐
- JavaScript-->基础类型和引用类型的区别
先了解一下数组的基础知识:附代码(数组属于引用类型的对象) <!DOCTYPE html> <html lang="en"> <head> &l ...
- WinPE基础知识之导入表
// 导入表 (结构体数组,以一个全零元素为结尾,每一个数组元素,代表一个PE文件导入信息) // 导入表存储的是从其它PE文件导入过来的函数名.序号,加载到内存之后,还存储这些函数的地址 typed ...
- oracel数据泵导出导入
Oracle11g 使用数据泵导入/导出数据 expdp/impdp 目标:使用oracle数据泵,将A电脑上的数据库databaseA导出后,再导入到B电脑上的数据库databaseB中. A电脑上 ...
- 2.3 使用 dom4j 对 xml文件进行 dom 解析
// 使用dom4j对XML文档进行解析 CRUD public class Demo1 { //读取XML文档中第二本书的书名 <书名>javaWEB</书名> @Test ...
- 工作总结 页面 ActionResult / JsonResult 将对象以 Json() 返回
其实都不用在页面上序列化 打印 都不需要在页面上 像这样 var ajaxResult = eval("(" + data + ")"); 序列化为对象 ...
- Computer Vision_1_Active Appearance Models:Active Appearance Models——2001
此为计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面. 1. Active Appearance Models 活动表观模型和活动轮廓模型基本思想来源 Snake,现在 ...
- Google C++单元测试框架GoogleTest---AdvancedGuide(译文)
上篇在这里: 下篇在这里.
- CentOS 7 系统初始化
0.安装系统基础依赖工具包 yum install net-tools gcc-c++ wget lrzsz vim ntpdate cronolog make psmisc 1.修改主机名 cent ...
- C#DataGrid列值出现E形式的小数,将DataGrid表格上的数据保存至数据库表时会因格式转换不正确导致报错
问题描述:在DataGridView中调整金额一列,当输入小数0.000001后会显示1E-6,此时进行保存操作时报错,提示无法将string类型转换成Decimal 原因分析:由于列调整金额为1E- ...
- BAT脚本批量调用Sql执行文件 (SqlServer 数据库)
@echo off & setlocal EnableDelayedExpansion set num=0set INSTANCE_HOSTNAME= 地址set INSTANCE_PORT= ...