前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux工具——sed整理

linux工具——sed整理

作者头像
数据仓库践行者
发布2022-04-18 16:07:54
8.6K0
发布2022-04-18 16:07:54
举报

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库践行者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档