linux工具——sed整理

2022-04-18 16:07:54 浏览数 (1)

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跳转呢,聪明的你能想到吗。。。

0 人点赞