Linux sed的使用

目录

  • sed编辑器
  • sed命令格式及参数选项
  • 使用
  • 替换、插入与删除
  • 打印
  • 文件IO
  • 退出

sed编辑器

sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。
在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。
流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器执行操作过程
(1)一次从输入中读取一行数据
(2)根据所提供的编辑器命令匹配数据
(3)按照命令修改流中的数据
(4)将新的数据输出到STDOUT

在流编辑器将所有命令与一行数据匹配完毕后,会读取下一行数据并重复这个过程。当处理完流中所有数据行后,就会终止。


sed命令格式及参数选项

使用

sed [选项] [脚本命令] 文件名
首先创建一个test.txt文件,并且拷贝一份

$ cat test.txt
This is a test of the test script.
This is the second test of the test script.

替换与删除

sed s替换命令基本格式

[address]s/pattern/replacement/flags

其中,address 表示指定要操作的具体行,s表示替换substitute,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。

flags标记及其功能
n:1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 C,但用户只想替换第二个 C,这是就用到这个标记;
g:对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 C,则只会替换第一个 C;
p:会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用;
w file:将缓冲区中的内容写到指定的 file 文件中;
&:用正则表达式匹配的内容进行替换;
\n:匹配第 n 个子串,该子串之前在 pattern 中用 () 指定;
\:转义(转义替换部分包含:&、\ 等)。

替换时指定新文本替换第几处模式匹配的地方

指定每行第2个匹配替换

sed 's/test/trial/2' test.txt

替换所有匹配的字符串flags为g

sed 's/test/trial/g' test.txt

我们知道,-n选项会禁止sed输出,但p标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行

sed -n 's/test/trial/p' test1.txt
$ cat test1.txt
This is a test line.
This is a different line.

w 标记会将匹配后的结果保存到指定文件中

sed 's/test/trial/w test_out.txt' test.txt

在使用 s 脚本命令时,替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义(前面加反斜杠)

sed 's/\/bin\/bash/\/bin\/csh/' test2.txt
$ cat test2.txt
qiuyinbin:/home/qiuyinbin:/bin/bash

结合-f参数

sed -f从文件中读取编辑器命令

$ cat script.txt
s/brown/green/
s/fox/elephant/
s/dog/cat/

$ cat test5.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.

sed -f script.sed test5.txt

sed d 替换脚本命令

[address]d

如果需要删除文本中的特定行,可以用 d 脚本命令,它会删除指定行中的所有内容。但使用该命令时要特别小心,如果你忘记指定具体行的话,文件中的所有内容都会被删除

sed 'd' test3.txt

表明所有行都被删除

$ cat test3.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog

address使用的几个简单的例子:

通过行号指定,如删除文件第三行

sed '3d' test4.txt
$ cat test4.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.

通过特定行区间指定,如删除第2、3行

sed '2,3d' test4.txt

使用两个文本模式来删除某个区间内的行,但这么做时要小心,你指定的第一个模式会“打开”行删除功能,第二个模式会“关闭”行删除功能,因此,sed 会删除两个指定行之间的所有行(包括指定的行)

如删除第 1~3 行的文本数据

sed '/1/,/3/d' test4.txt

或者通过特殊的文件结尾字符,比如删除test4.txt 文件内容中第3行开始的所有的内容

sed '3,$d' test4.txt

sed a 和 i 脚本命令

a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行,这里之所以要同时介绍这 2 个脚本命令,因为它们的基本格式完全相同

[address]a(或i)\新文本内容

在第三行前插入行

sed '3i\This is an inserted line.' test4.txt

在第三行后插入一行

sed '3a\This is an inserted line.' test4.txt

如果你想将一个多行数据添加到数据流中,只需对要插入或附加的文本中的每一行末尾(除最后一行)添加反斜线即可(这里是第一行前插入)

sed '1i\This is one line of new text.\
This is another line of new text.' test4.txt

sed c 替换脚本命令

c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。

[address]c\用于替换的新文本

替换文件test4.txt第3行内容为This is a changed line of text.

sed '3c\This is a changed line of text.' test4.txt

sed y 转换脚本命令

[address]y/inchars/outchars/

转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符...这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。

sed 'y/123/789/' test4.txt

sed r 脚本命令

r 命令用于将一个独立文件的数据插入到当前数据流的指定位置

[address]r filename

sed 命令会将 filename 文件中的内容插入到 address 指定行的后面

sed '2r test.txt' test4.txt

sed p 打印脚本命令

p 命令表示搜索符号条件的行,并输出该行的内容

[address]p

p 命令常见的用法是打印包含匹配文本模式的行

sed -n '/number 3/p' test4.txt

如果需要在修改之前查看行,也可以使用打印命令,比如与替换或修改命令一起使用。可以创建一个脚本在修改行之前显示该行

sed -n '/3/{ 
p 
s/line/test/p 
}' test4.txt
image.png

sed 命令会查找包含数字 3 的行,然后执行两条命令。首先,脚本用 p 命令来打印出原始行;然后它用 s 命令替换文本,并用 p 标记打印出替换结果。输出同时显示了原来的行文本和新的行文本。

sed w 脚本命令

w 命令用来将文本中指定行的内容写入文件中

[address]w filename

这里的 filename 表示文件名,可以使用相对路径或绝对路径,但不管是哪种,运行 sed 命令的用户都必须有文件的写权限。

sed '1,2w test6.txt' test4.txt
image.png

加上-n选项不会输出原始文件的行

sed -n '1,2w test6.txt' test4.txt

sed q 退出脚本命令

q命令的作用是使 sed 命令在第一次匹配任务结束后,退出 sed 程序,不再进行对后续数据的处理。

sed '2q' test4.txt

找到number 1之后执行{}中的操作,然后直接退出

sed '/number 1/{ s/number 1/number 0/;q; }' test4.txt

参考
C语言中文网http://c.biancheng.net/view/4028.html
书籍《Linux命令行与shell脚本编程大全》


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

推荐阅读更多精彩内容

  • sed 一种流向编辑器 stream editor,是Linux中三大文件处理工具(awk, sed, grep)...
    zhusitao阅读 3,529评论 0 1
  • 1、rpm与yum命令的常见选项 rpm常见选项 -i 安装 -v 显示进度条 -test 测试安装,检查依赖和冲...
    rspclei阅读 180评论 0 0
  • sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选...
    sony93阅读 4,833评论 1 0
  • sed命令概述说明: sed命令:字符流编辑工具(行编辑工具)===按照每行中的字符进行处理操作 1擅长对行进行操...
    大仙儿没溜儿阅读 365评论 0 1
  • sed sed命令以行为单位对文本文件进行处理。 可以针对特定的行进行处理,直接指定行号,如1,也可以通过正则匹配...
    观星阅读 521评论 0 0