首页 > 其他分享 >sed命令详解

sed命令详解

时间:2022-08-19 10:57:13浏览次数:44  
标签:匹配 命令 sed file test 替换 详解

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

 

 

 

标签:匹配,命令,sed,file,test,替换,详解
From: https://www.cnblogs.com/kuangzhuming/p/16601251.html

相关文章

  • C# AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别
    AppDomain.CurrentDomain.BaseDirectory返回结果为::D:\mycode\,而Application.StartupPath返回结果为:D:\mycodeApplication.StartupPath只能用于WinForm窗体中,而AppDom......
  • Jmeter(四十九) - 从入门到精通高级篇 - jmeter使用监视器结果监控tomcat性能(详解教程
    ------------------------------------------------------------------- 转载自:北京-宏哥https://www.cnblogs.com/du-hong/p/13667219.html -------------------------......
  • hibernate:映射文件hbm.xml详解
    转载:http://www.cnblogs.com/fingerboy/p/5233939.html实体类就是指普通的POJO,Hibernate并不知道那个实体类对应数据库的哪一张表,所以还需要配置一下,常用的方式就是*.......
  • kubectl常用命令
    1,查看所有pod列表,-n后跟namespace,查看指定的命名空间 kubectlgetpodkubectlgetpod-nkubekubectlgetpod-owide 2,查看RC和service列表,......
  • menuconfig(基于文本(命令行)的图形化配置界面)是如何实现的
    引在编译linux内核时,makemenuconfig命令可以在命令行终端下显示“图形”配置界面。vim,top,emacs,screen等命令都可以显示“图形界面”原理[https://blog.csdn.net/Sh......
  • linux之htop命令
      参考文档:https://www.jianshu.com/p/32112b3776e3 ......
  • Pytest系列(2-3)-conftest详解
    什么是conftest.py可以理解成一个专门存放fixture的配置文件 实际开发场景多个测试用例文件(test_*.py)的所有用例都需要用登录功能来作为前置操作,那就不能把登录功能写......
  • 【靶机详解】DC-2
    目录环境搭建环境信息渗透思路1信息收集2漏洞发现3漏洞利用知识点汇总参考资料环境搭建下载靶机(DC-2靶机下载)解压后,使用VMware打开,并将攻击机和靶机的网卡,设置为NA......
  • 【pytest】命令行参数-durations统计用例运行时间
    前言:写完一个项目的自动化用例之后,发现有些用例运行较慢,影响整体的用例运行速度,于是领导说找出运行慢的那几个用例优化下。--durations参数可以统计出每个用例运行的时......
  • linux下Screen常用命令
    常用命令:Screen screen-Syourname->新建一个叫yourname的sessionscreen-ls->列出当前所有的sessionscreen-ryourname->回到yourname这个sessionscreen-d......