sed命令详解

本文转自 http://man.linuxde.net/sed

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed处理文本时以行为单位。

sed的选项、命令、替换标记

**命令格式 **:

sed [options] 'command' file(s) 
sed [options] -f scriptfile file(s) 

[options]:
-e<script>或--expression=<script>: 以选项中的指定的script来处理输入的文本文件
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件
-i :直接编辑文件
-h或--help:显示帮助
-n或--quiet或--silent:仅显示script处理后的结果,常与-p命令一起使用表示仅打印输出那些进行命令操作的行
-v或--version:显示版本信息
sed命令
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。 
c\ 把选定的行改为新的文本。 
d 删除,删除选择的行。 
D 删除模板块的第一行。 
s 替换指定字符 
h 拷贝模板块的内容到内存中的缓冲区。 
H 追加模板块的内容到内存中的缓冲区。 
g 获得内存缓冲区的内容,并替代当前模板块中的文本。 
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 
l 列表不能打印字符的清单。 
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。 
p 打印模板块的行。 
P(大写) 打印模板块的第一行。 
q 退出Sed。 
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。 
r file 从file中读行。 
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
w file 写并追加模板块到file末尾。 
W file 写并追加模板块的第一行到file末尾。 
! 表示后面的命令对所有没有被选定的行发生作用。 
= 打印当前行号码。 
# 把注释扩展到下一个换行符以前
sed替换标记
g 表示行内全面替换。 
p 表示打印行。 
w 表示把行写入一个文件。 
x 表示互换模板块中的文本和缓冲区中的文本。 
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。
\1 子串匹配标记 。
& 已匹配字符串标记。
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。 
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。 
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。 
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 
[] 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。 
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 
\< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。 
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。 
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。 
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
sed用法实例

1. 替换操作:s命令

sed 's/book/books/' file         # 将file文件中每一行的第一个book替换为books

2. 全面替换标记g

sed 's/book/books/g' file      # 替换file文件每一行中的所有匹配
# 当需要从第N处匹配开始替换时,可以使用/Ng
sed 's/book/books/2g' file    # 从file每一行第二个匹配的开始替换

3. 定界符
以上命令中字符 / 在sed中作为定界符使用,也可以使用其他的任意定界符:

sed 's:test:TEXT:g' file             # 以:作为定界符
sed 's|test|TEXT|g' file             # 以|作为定界符
# 定界符出现在式样内部时,需要进行转义
sed 's/\/bin\/bash/bin/g' file          # 将/bin/bash替换为bin

4. 删除操作:d命令

sed '/^$/d' file          # 删除空白行
sed '2d' file             # 删除第二行
sed '$d' file             # 删除最后一行
sed '2,$d' file           # 删除第二行到最后一行
sed '/^test/d'            # 删除所有以test开头的行

5. 已匹配字符串标记&
正则表达式\w\+匹配到的每一个单词,使用[&]替换他,&对应于之前匹配到的单词

echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]

# 所有以192.168.01开头的行都会被替换成自己加上localhost:
sed 's/^192.168.01/&localhost/' file
192.168.01localhost

6. 子串匹配标记\1
匹配给定样式其中的一部分

echo this is digit 7 number | sed 's/digit \([0-9]\)/\1/'
this  is 7 number
# 命令中digit 7 被替换成了7。样式匹配到的子串是7,\(\)用于匹配子串,
# 对于匹配到的子串第一个就标记为\1,以此类推,匹配到的第二个子串是\2
echo aaa bbb | sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/'
bbb aaa

sed -n 's/\(love\)able/\1rs/p' file    # 将file中的loveable替换为lovers,并打印出来
lovers

7. 组合多个表达式

sed '表达式' | sed '表达式' <==> sed '表达式;表达式'

8. 引用
sed 表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号

test=hello
echo hello WORLD | sed "s/$test/HELLO/"
HELLO WORLD

9. 选定行的范围:,(逗号)

# 所有在模板test和check所确定的范围内的行都被打印
sed -n '/test/,/check/p' file

# 打印第五行开始到第一个包含以test开头的行之间的所有行
sed -n '5,/^test/p' file

# 对于模板test和west之间的行,每行的末尾用字符aaa bbb替换
sed '/test/,/west/s/$/aaa bbb/' file

10. 多点编辑:e命令
-e选项允许在同一行里执行多条命令

sed -e '1,5d' -e 's/test/check/' file
# 第一条命令删除1至5行,第二条命令用check替换test。
# 命令执行顺序对结果有影响,如果两个都是替换命令那么第一个替换命令将影响第二个替换命令的结果

11. 从文件读入:r命令

# file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面
sed '/test/r file' filename

写入文件:w命令

# 在example中所有包含test的行都被写入file里
sed -n '/test/w file' example

12. 追加(行下):a\命令

# 将this is a test line追加到以test开头的行的后面
sed '/^test/a\this is a test line' file

# 在test.conf文件第二行之后插入this is a test line
sed -i '2a\this is a test line' file

13. 插入(行上):i\命令

# 将this is a test line 插入到以test开头的行的前面
sed '/^test/i\this is a test line' file

# 在第五行之前插入this is a test line
sed '5i\this is a test line' file

14. 下一个:n命令

# 如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行
sed '/test/{ n; s/aa/bb/; }' file

15. 变形:y命令

# 把1-10行内所有的abcde转变为大写,注意,正则表达式元字符不能使用这个命令
sed '1,10y/abcde/ABCDE/' file

16. 退出:q命令

sed '10q' file           # 打印完第十行后,退出sed

17. 保持和获取:h命令和G命令
在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理

sed -e '/test/h' -e '$G' file
# 在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。
# 第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。
# 在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

18. 保持和互换:h命令和x命令
互换模式空间和保持缓冲区的内容。

sed -e 'test/h' -e '/check/x' file         # 把包含test与check的行互换

19. 脚本scriptfile
sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

sed [options] -f scriptfile file

20. 打印奇数或偶数行

方法1:
sed -n 'p;n' test          # 奇数行
sed -n 'n;p' test          # 偶数行

方法2:
sed -n '1~2p' test         # 奇数行
sed -n '2~2p' test         # 偶数行

21. 打印匹配字符串的下一行

grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE
awk '/SCC/{getline;print}' URFILE
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • linux sed命令详解 1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行...
    很少更新了阅读 2,156评论 0 6
  • shell sed命令详解 sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中...
    zplodge阅读 1,909评论 0 0
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,128评论 2 34
  • sed 即 stream editor,一个简单而强大的文本解析转换工具,1973-1974年期间由贝尔实验室的 ...
    rollingstarky阅读 751评论 0 3
  • 1. 简介 sed命令是一个很强大的文本编辑器,可以对来自文件、以及标准输入的文本进行编辑。 执行时,sed会从文...
    tyrone_li阅读 21,564评论 2 12