Sed学习整理

结合自己使用需要,主要根据三十分钟学会SED简化整理所得。

用途

sed是一个文本解析转换工具,主要用于以下用途:

  • 文本替换
  • 选择性的输出文本文件
  • 从文本文件的某处开始编辑
  • 无交互式的对文本文件进行编辑等

工作流

SED遵循简单的工作流:读取,执行和显示。

  • 读取: SED从输入流(文件,管道或者标准输入)中读取一行并且存储到它叫做 模式空间(pattern buffer)的内部缓冲区

  • 执行: 默认情况下,所有的SED命令都在模式空间中顺序的执行,除非指定了行的地址,否则SED命令将会在所有的行上依次执行

  • 显示: 发送修改后的内容到输出流。在发送数据之后,模式空间将会被清空。
    在文件所有的内容都被处理完成之前,上述过程将会重复执行

注意事项
  • 模式空间 (pattern buffer) 是一块活跃的缓冲区,在sed编辑器执行命令时它会保存待检查的文本
  • 默认情况下,所有的SED命令都是在模式空间中执行,因此输入文件并不会发生改变
  • 还有另外一个缓冲区叫做** 保持空间** (hold buffer),在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。在每一个循环结束的时候,SED将会移除模式空间中的内容,但是该缓冲区中的内容在所有的循环过程中是持久存储的。SED命令无法直接在该缓冲区中执行,因此SED允许数据在 **保持空间 **和 模式空间之间切换
  • 初始情况下,保持空间 和** 模式空间** 这两个缓冲区都是空的
  • 如果没有提供输入文件的话,SED将会从标准输入接收请求
  • 如果没有提供地址范围的话,默认情况下SED将会对所有的行进行操作

基础语法

sed [-n] [-e] 'command(s)' files 
sed [-n] -f scriptfile files

第一种方式在命令行中使用单引号指定要执行的命令,第二种方式则指定了包含SED命令的脚本文件。


标准选项

  • -n:默认情况下,模式空间中的内容在处理完成后将会打印到标准输出,该选项用于阻止该行为
  $ sed '' hello.txt  #创建个hello的txt,''表示没输入任何命令
  hello
  $ sed -n '' hello.txt  
  • -e:指定要执行的命令,使用该参数,我们可以指定多个命令,让我们打印每一行两次:
  $ sed -e '' -e 'p' hello.txt
 hello
 hello
  • -f: 指定包含要执行的命令的脚本文件
  $ echo "p" > commands
  $
  $ sed -n -f commands hello.txt
  hello

行寻址

默认情况下,在SED中使用的命令会作用于文本数据的所有行。如果只想将命令作用于特定的行或者某些行,则需要使用 行寻址 功能。

[address]command   #基本语法

先创建一个文本用于演示.

$ cat demo.txt
1 one
2 two
3 three
4 four
5 five
6 six

1.以数字形式表示的行区间

指定行。

$ sed -n '3p' demo.txt  #p命令是打印出模式空间中的内容
3 three

用逗号确定范围

$ sed -n '2,4p' demo.txt
2 two
3 three
4 four

$符号表示最后一行

$ sed -n '4,$ p' demo.txt
4 four
5 five
6 six

SED还提供了另外两种操作符用于指定地址范围,第一个是加号(+)操作符,它可以与逗号(,)操作符一起使用,例如 M, +n 将会打印出从第M行开始的下n行

$ sed -n '2,+2p' demo.txt
2 two
3 three
4 four

我们还可以使用波浪线操作符()指定地址范围,它使用MN的形式,它告诉SED应该处理M行开始的每N行。例如,50~5匹配行号50,55,60,65等,让我们只输出文件中的奇数行

$ sed -n '1~2p' demo.txt
1 one 
3 three
5 five

注意,如果使用的是Mac系统自带的sed命令,可能不支持~和+操作符。可以使用brew install gnu-sed --with-default-names重新安装GNU-SED。

2.使用文本过滤器
/pattern/command  #一般格式
$ sed -n '/three/ p' demo.txt
3 three

规则与数字表示一样,也可以与数字表示配合使用.

$ sed -n '/one/,/three/ p' demo.txt
1 one
2 two
3 three

$ sed -n '/3/ p' demo.txt
3 three


基本命令

  • 删除命令 d
[address1[,address2]]d

address1和address2是开始和截止地址,它们可以是行号或者字符串匹配模式,这两种地址都是可选的。
注意的是,该命令只会移除模式空间中的行,但原始内容不会改变。

$ sed '3,5 d' demo.txt
1 one
2 two
6 six
  • 文件写入命令 w

SED提供了 write 命令用于将模式空间中的内容写入到文件

$ sed -n '2,3 w junk.txt' demo.txt 
$ cat junk.txt
2 two
3 three
  • 追加命令 a
[address]a Append text
$ sed '2 a 9 nine' demo.txt
1 one
2 two
9 nine
3 three
4 four
5 five
6 six
  • 插入命令 i
    与a相同,不过是在匹配的位置前增加一行。
  • 行替换命令 c
    SED通过 c 提供了 change 和 replace 命令,该命令帮助我们使用新文本替换已经存在的行,当提供行的地址范围时,所有的行都被作为一组被替换为单行文本
$ sed '3,5 c 9 nine' demo.txt
1 one
2 two
9 nine
6 six
  • 替换命令 s
[address1[,address2]]s/pattern/replacement/[flags]
$ sed 's/one/first/' demo.txt
1 first
2 two
3 three
4 four
5 five
6 six

在SED中,使用替换命令的时候默认只会对第一个匹配的位置进行替换.
以下有一些参数可供使用。

  • g对所有匹配的内容进行替换。

  • 数字n: 只替换第n次匹配。

  • p:只输出改变的行。

  • w:存储改变的行到文件。比如sed 's/one/first/w demoCopy.txt' demo.txt

  • i:匹配时忽略大小写。

  • 排除命令 !

$ sed -n '/two/ !p' demo.txt
1 one
3 three
4 four
5 five
6 six

保持空间

在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。有5条命令可用来操作保持空间

命令 作用
h 将模式空间复制到保持空间
H 将模式空间附加到保持空间
g 将保持空间复制到模式空间
G 将保持空间附加到模式空间
x 交换模式空间和保持空间的内容
$ sed -n '1!G;h;$p' demo.txt
6 six
5 five
4 four
3 three
2 two
1 one
  1. 1!G 这句的意思是出了第一行之外,处理每一行的时候都将保持空间中的内容追加到模式空间(正序->倒序)
  2. h 将模式空间中的内容复制到保持空间以备下一行匹配的时候追加到下一行的后面
  3. $p 如果匹配到最后一行的话则输出模式空间中的内容
  4. 上述步骤不断重复直到文本结束刚好将文件内容翻转了一次
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 本文承接之前写的三十分钟学会AWK一文,在学习完AWK之后,趁热打铁又学习了一下SED,不得不说这两个工具真的堪称...
    mylxsw阅读 4,382评论 3 74
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,128评论 2 34
  • 这篇是当初看完Chinaunix论坛的帖子“抛砖引玉----翻译加注sed1line”的笔记,最近无聊从Evern...
    magic5650阅读 1,144评论 0 4
  • Sed工具工作原理及特性 1. sed是流编辑器,每一次读取一行到内存中,即称之为模式空间(pattern spa...
    魏镇坪阅读 10,921评论 0 12
  • 在上一个笔记里已经把IjkVideoView改造成简版的轮子了,现在来写符合自己需求的控制器。我本次项目中主要写了...
    蓝小默阅读 1,848评论 1 51