Hi, 我是小萝卜算子
既然重温了linux工具——grep文本处理器, 怎能少了sed......
一、介绍
sed是Linux中最常用的"文本处理工具"之一,常规情况下,每次匹配一行内容到模式空间,经过处理变化之后,输出结果
针对个别特殊情况,比如想连续操作多行数据,可使用hold空间以及t,b分支控制输出,功能相当强大
二、使用格式
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]... (sed --help提示)
option:sed 使用参数
script:筛选条件/编辑命令
input-file: 操作的文件
三、常用参数
--option
-e:多点编辑
-f:从文件读取命令
-i:对执行文件进行修改
-n:只显示处理过的行
-r:扩展正则表达式
--select(筛选)
筛选条件 (下面英文是我自己想的,同学们看明白即可,开始和结束可自由匹配)
num: 具体数字 ,指定具体行比如 5d 代表删除第五行
start,end: 指定开始和结束行号
$: 末尾行
start~step: 指定开始行和步长
start, num: 表示向后匹配num行
/regex/:正则匹配行
/regex/I: 忽略大小写
-- line operate(行操作)
a:追加(行后插入)
i:插入(行前插入)
c:更改(当前行)
d:删除(当前行)
p:打印(当前行)
=:打印行号
!:非,类似linux工具——神奇的正则表达式 中的!
r,w 读写(我用的比较少)
--content operate(内容操作)
s:替换
替换掉匹配的内容,与linux工具——vim文本编辑器整理中命令行模式的替换类似,基本用法:s/src/dest/g(n)p
src: 原内容(可以使用正则)
dest: 目标内容,可以对src中正则内容进行引用和操作
U(L): 转换大(小)写
u(l): 将第一个字母转换为大(小)写
num: 代表src中的分组内容
&: 代表整个src
g: 全局
n: 第n个
p: 打印
四、高阶命令
--空间
sed 一般情况下都是在模式空间操作,以下命令牵涉到保持空间,可以理解为操作空间的一个暂存空间
n(N):读取下一行到模式空间(覆盖/追加)
d(D):删除模式空间(首行)
h(H):复制模式空间内容,到保持空间, 覆盖(追加)
g(G):复制保持空间内容,到模式空间, 覆盖(追加)
x:交换模式空间与保持空间内容
--分支
b: 跳转
基本格式: b [label] ,如果存在label标签,则跳转到label标签处,如果不存在,则跳转到脚本末尾,属于无条件转移
t: 也是跳转,但是相当于if else ;如果t前面的替换命令执行成功,则跳转到末尾,如果不成功,则继续执行下一个命令
五:应用实例
新建文档tmp.txt,内容如下
- 筛选 (awk 是凑数的,提供一个思路)
获得从hanmeimei 到lilei 的行
sed -n '/han meimei/I,/li lei/Ip' tmp.txt
awk 'BEGIN{IGNORECASE=1;flag=0}{if(flag==0 &&
- 获得偶数行
sed -n "2~2p" tmp.txt
sed -n 'n;p' tmp.txt
sed '1d;n;d' tmp.txt
awk "NR%2==0" tmp.txt
awk '!(NR%2)' tmp.txt
- 在最后一行后面插入perfect
sed '$aperfect' tmp.txt
awk '{print $0}END{print "perfect"}' tmp.txt
- 删除不包含you的行
sed '/you/!d' tmp.txt
sed -n '/you/p' tmp.txt
grep 'you' tmp.txt
awk '/you/' tmp.txt
- 获取 文本总行数 (grep 纯属混个脸熟哈哈)
sed -n '$=' tmp.txt
wc -l tmp.txt
awk 'END{print NR} ' tmp.txt
grep -n '' tmp.txt | wc -l (awk -F ":" 'END{print $1}')
- 为每行第一个出现的字母e 添加[]
sed 's/e/[&]/' tmp.txt
sed 's/(e)/[1]/' tmp.txt
sed -r 's/(e)/[1]/' tmp.txt
- 将tmp.txt中包含you的行写到新文件 you.txt
sed '/you/w you.txt' tmp.txt
sed -n '/you/p' tmp.txt > you.txt
grep 'you' tmp.txt > you.txt
awk '/you/' tmp.txt > you.txt
- 把文本数据行合并起来,中间用--分隔
sed ':tag;N;s/n/--/; btag' tmp.txt
sed ':tag;$!N;s/n/--/; ttag' tmp.txt
cat tmp.txt| tr "n" "--"
sed 'H;!d;{g;s/^n//;s/n/--/g;}' tmp.txt
六:思考
sed 掌握基本命令,工作中就能解决98% 的问题,
如果需要使用到多行操作的话,就得考虑暂存空间或者分支了
本文从入门到放弃的描述了sed 各个场景的用法,希望多小伙伴们有所帮助呀,有更简单的方法的欢迎私下交流
最后一个例子合并行中
sed ':tag;$!N;s/n/--/; ttag' tmp.txt
为什么不能使用b跳转呢,聪明的你能想到吗。。。