Linux学习 - SED操作,awk的姊妹篇
时间:2022-04-26
本文章向大家介绍Linux学习 - SED操作,awk的姊妹篇,主要内容包括sed基本参数解释、常见操作、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
awk
和sed
想一对兄妹,一个出现,就会问起另一个。现在,都来了。
sed基本参数解释
sed是stream editor
的简称,擅长对文件进行各种正则操作、插入操作、替换操作和删除操作,可以全局,可以指定特定范围的行或者特定特征的行。
s/pat/replace/
: 正则替换
前插行i
, 后插行a
, 替换行c
, 删除行d
, 输出行p
N
: 读入下一行,同时存储;n
:读入下一行,抛弃当前行
常见操作
- 替换特定的文本
ct@ehbio:~/SXBD$ cat mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
ct@ehbio:~/SXBD$ sed 's/ /_/' mat
ID 2_cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
ct@ehbio:~/SXBD$ sed 's/ /_/g' mat
ID 2_cell 4_cell 8_cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
- 获得逗号分隔的一组数
ct@ehbio:~/SXBD$ echo `seq 1 10` | sed 's/ /,/g'
1,2,3,4,5,6,7,8,9,10
- 针对指定行替换
ct@ehbio:~/SXBD$ sed '2,$ s/_[0-9]//g' mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1 2 3 4 5
Nanog 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1 2 3 4 5
- 替换特定出现位置
# 替换第一个空格
ct@ehbio:~/SXBD$ sed 's/ /_/1' mat
ID 2_cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 替换第二个空格
ct@ehbio:~/SXBD$ sed 's/ /_/2' mat
ID 2 cell 4_cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 替换第二个及以后的空格
ct@ehbio:~/SXBD$ sed 's/ /_/2g' mat
ID 2 cell 4_cell 8_cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
- 给序列起名字
ct@ehbio:~/SXBD$ cat seq
ACDGTFGGCATGCDTGD
ACDGAGCDTAGCDGTA
CAGDTAGDCTADTG
ct@ehbio:~/SXBD$ sed = seq
1
ACDGTFGGCATGCDTGD
2
ACDGAGCDTAGCDGTA
3
CAGDTAGDCTADTG
# 同时缓冲两行,但只对第一行行首操作
ct@ehbio:~/SXBD$ sed = seq | sed 'N;s/^/>/;'
>1
ACDGTFGGCATGCDTGD
>2
ACDGAGCDTAGCDGTA
>3
CAGDTAGDCTADTG
- 给文件增加标题行
ct@ehbio:~/SXBD$ tail -n +2 mat | sort -k2,2n
c-Myc 2 3 4 5
Nanog_1 2 3.2 4.3 5
Pou5f1_1 2 3 4 5
Tet1_3 2 3 4 5
# 1 表示第一行
# i 表示插入,在指定行前面插入新行
ct@ehbio:~/SXBD$ tail -n +2 mat | sort -k2,2n | sed '1 i IDt2_cellt4_cellt8_celltembryo'
ID 2_cell 4_cell 8_cell embryo
c-Myc 2 3 4 5
Nanog_1 2 3.2 4.3 5
Pou5f1_1 2 3 4 5
Tet1_3 2 3 4 5
- 提取特定或指定范围的行
# -n是必须的,阻止程序自动输出匹配行,不然会导致重复输出
ct@ehbio:~/SXBD$ sed -n '2,4p' mat
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
ct@ehbio:~/SXBD$ sed -n '4p' mat
c-Myc 2 3 4 5
- 提取符合特定模式的行
ct@ehbio:~/SXBD$ sed -n '/_/ p' mat
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
Tet1_3 2 3 4 5
ct@ehbio:~/SXBD$ sed -n '/-/ p' mat
c-Myc 2 3 4 5
- 去除文件中的空行
ct@ehbio:~/SXBD$ cat mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 空行就是只有行首和行尾的行
ct@ehbio:~/SXBD$ sed '/^$/d' mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
- 原位删除
ct@ehbio:~/SXBD$ cat mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# -i 参数的使用
ct@ehbio:~/SXBD$ sed -i '/^$/d' mat
ct@ehbio:~/SXBD$ cat mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
- 删除指定范围的行
ct@ehbio:~/SXBD$ cat mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc_2 2 3 4 5
Tet1_3 2 3 4 5
ct@ehbio:~/SXBD$ sed '2,3d' mat
ID 2 cell 4 cell 8 cell embryo
c-Myc_2 2 3 4 5
Tet1_3 2 3 4 5
- 记忆匹配
()
启动记忆匹配;1
为第一个匹配项,2
为第二个匹配项;匹配项的计数根据左括号出现的位置来定,第一个(
包括起来的为1
。
ct@ehbio:~/SXBD$ echo "hah ehbio hah" | sed 's/ (.*) /t1t1t/'
hah ehbio ehbio hah
- 奇偶数行处理
ct@ehbio:~/SXBD$ echo -e "oddnevennoddneven"
odd
even
odd
even
# 奇偶数行合并
ct@ehbio:~/SXBD$ echo -e "oddnevennoddneven" | sed 'N;s/n/t/'
odd even
odd even
# 取出偶数行,比较简单
# 注意 n (小写)撇掉了奇数行
ct@ehbio:~/SXBD$ echo -e "oddnevennoddneven" | sed -n 'n;p'
even
even
# 取出奇数行
# 先都读进去,然后替换偶数行为空值,再输出
ct@ehbio:~/SXBD$ echo -e "oddnevennoddneven" | sed -n 'N;s/n.*//;p'
odd
odd
- Windows/Linux换行符困境
Windows下的换行符是rn
, Linux下换行符是n
, MAC下换行符是r
。所以Windows下的文件拷贝到Linux后,常会出现行尾多一个^M
符号的情况,从而引起匹配或其它解析问题。
^M
的输是 ctrl+v+M
ctrl+v;ctrl+m
,不是简单的输入^
,再输入M
。
ct@ehbio:~/SXBD$ cat -A windows.txt
ID^M$
A^M$
B^M$
C^M$
ct@ehbio:~/SXBD$ sed 's/^M//' windows.txt | cat -A
ID$
A$
B$
C$
- sed中使用bash变量
# 注意双引号的使用
ct@ehbio:~/SXBD$ bash_variable='ehbio'
ct@ehbio:~/SXBD$ echo "sheng xin bao dan " | sed "s/$/$bash_variable/"
sheng xin bao dan ehbio
正则表达式不同语言略有差别,但整体相近,更多正则操作见:不用Linux也可以的强大文本处理方法。
- C# 实现发送手机短信
- 软件测试人员必须掌握的Linux基本命令
- 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
- Capturing Packets in Linux at a Speed of Millions of PPS
- 【机器学习笔记之四】Adaboost 算法
- 【Java学习笔记之十九】super在Java继承中的用法小结
- 【Java学习笔记之二十一】抽象类在Java继承中的用法小结
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- 基于Windows下python环境变量配置
- 【机器学习笔记之七】PCA 的数学原理和可视化效果
- 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
- 【专知-关关的刷题日记20】Leetcode 119. Pascal's Triangle II
- 2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
- 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 17.splash_case02
- 17.splash_case03
- 17.splash_case06_ScrapySplashTest-master
- 17.获取代理ip
- 18.scrapy_maitian
- 18.scrapy_maitian_analysis
- 19.SimLogin_case01
- 19.SimLogin_case02
- 19.SimLogin_case03
- 19.SimLogin_case04
- 19.SimLogin_case05
- 19.SimLogin_case06
- 19.SimLogin_case07
- 19.SimLogin_case08
- 轻量级 Node.js Web 框架 Daruk2.0 正式版发布了!