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命令

 1 a\ 在当前行下面插入文本。
 2 i\ 在当前行上面插入文本。 
 3 c\ 把选定的行改为新的文本。 
 4 d 删除,删除选择的行。 
 5 D 删除模板块的第一行。 
 6 s 替换指定字符 
 7 h 拷贝模板块的内容到内存中的缓冲区。 
 8 H 追加模板块的内容到内存中的缓冲区。 
 9 g 获得内存缓冲区的内容,并替代当前模板块中的文本。 
10 G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 
11 l 列表不能打印字符的清单。 
12 n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 
13 N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。 
14 p 打印模板块的行。 
15 P(大写) 打印模板块的第一行。 
16 q 退出Sed。 
17 b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。 
18 r file 从file中读行。 
19 t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
20 T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
21 w file 写并追加模板块到file末尾。 
22 W file 写并追加模板块的第一行到file末尾。 
23 ! 表示后面的命令对所有没有被选定的行发生作用。 
24 = 打印当前行号码。 
25 # 把注释扩展到下一个换行符以前
sed替换标记
1 g 表示行内全面替换。 
2 p 表示打印行。 
3 w 表示把行写入一个文件。 
4 x 表示互换模板块中的文本和缓冲区中的文本。 
5 y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。
6 \1 子串匹配标记 。
7 & 已匹配字符串标记。
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

 

 

 

posted on 2022-08-19 10:46  KuangZhuMing  阅读(5031)  评论(0编辑  收藏  举报