shell脚本之sed详解 (sed命令 , sed -e , sed s/ new / old / ... )
Sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。vi中的正则表达式命令在sed中大多可以通用。
sed常用选项
| -e script 指定sed编辑命令 |
| |
| -f scriptfile 指定的文件中是sed编辑命令 |
| |
| -n 寂静模式,抑制来自sed命令执行过程中的冗余输出信息,比如只显示那些被改变的行。 |
| |
| -i[SUFFIX], –in-place[=SUFFIX] 替换和备份源文件 |
| |
| edit files in place (makes backup if extension supplied) |
1. 参数p: 打印匹配行
| $ sed -n ’2p’/etc/passwd 打印出第2行 |
| $ sed -n ’1,3p’/etc/passwd 打印出第1到第3行 |
| $ sed -n ‘$p’/etc/passwd 打印出最后一行 |
| $ sed -n ‘/user/p’ /etc/passwd 打印出含有user的行 |
| $ sed -n ‘/\$/p’ /etc/passwd 打印出含有$元字符的行,$意为最后一行 |
| $ sed -n ‘$=’ ok.txt 打印总行数 |
2.参数a和i: 插入文本和附加文本(插入新行)
| $ sed -n ‘/FTP/p’/etc/passwd 打印出有FTP的行 |
| $ sed ‘/FTP/a\ 456′ /etc/passwd 在含有FTP的行后面新插入一行,内容为456 |
| $ sed ‘/FTP/i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,内容为123 |
| $ sed ‘/FTP/i\ “123″’ /etc/passwd在含有FTP的行前面新插入一行,内容为”123″ |
| $ sed ’5 a\ 123′ /etc/passwd 在第5行后插入一新行,内容为123 |
| $ sed ’5 i\ “12345″’ /etc/passwd 在第5行前插入一新行,内容为”123表达式45″ |
sed-搜索结果后面增加嵌入代码
| #!/bin/bash |
| |
| find ./ -name “*.html” -exec grep 10000008/100 ‘{}’ \; -exec sed -i ‘/10000008/a\<\!--\ |
3.参数d:删除文本
删空格
| sed -i ‘s/[ ]*//g’ ~/$cid.txt |
删除无内容空行
| sed ‘/^$/d’ file.conf > file.new.conf |
| sed -i ‘/^$/d’ ~/$cid.txt |
删第一行
删前两行
del多行
| cat SCTP.log |sed ’1d;2d;$d’ |
删除最后一行:
删除最后两行:
| sed ‘N;$!P;D’ file |
| sed ‘N;$!P;$!D;$d’ file |
删除最后n行:
| $vi sed.sh |
| $!/bin/bash |
| A=$(sed -n ‘$=’ file) |
| sed $(($A-n+1)),${A}d file |
| |
| $ sed ‘/user/d’/etc/passwd |
删除带有string的行(del include love row head)
| sed -i ‘/^love/d’ file |
| sed -i ‘/love/d’ file |
vi删除包含strings前4行,后34行
删除配置文件中#号注释行
| sed ‘s#\#.*##’ file.conf > file.new.conf |
| sed ‘s,\#.*,,’ |
删除配置文件中//号注释行
删除由空格和Tab而成的空行
| sed ‘/^[[:space:]]*$/d’ file.conf > file.new.conf |
| sed ‘/^[[:space:]]*$/d’ |
删除尾行的空格
| sed -e ‘s/.$//’ file > file.new.conf |
在尾行添加1个空格
| sed ‘s/[0-9]$/& /g’ file > flile.new.conf |
4. 参数s:替换文本,替换命令用替换模式替换指定模式,格式为:
[ a d d r e s s [,address]] s/pattern-to-find/replacement-pattern/[g p w n]
| $ sed ‘s/user/USER/’/etc/passwd 将第1个user替换成USER,g表明全局替换 |
| $ sed ‘s/user/USER/g’/etc/passwd 将所有user替换成USER |
| $ sed ‘s/user/ |
| $ sed ‘s/user//’/etc/passwd 将第1个user替换成空 |
| $ sed ‘s/user/&11111111111111/’/etc/passwd 如果要附加或修改一个很长的字符串,可以使用( &)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面,这里是把&放前面 |
| $ sed ‘s/user/11111111111111&/’/etc/passwd 这里是将&放后面 在包含字符串test的任意行上,将111替换成222 |
| $ sed ‘/test/s/111/222/g’ sample.txt |
5. 快速一行正则表达式命令 下面是一些一行命令集。([ ]表示空格,[TAB]表示t a b键)
| ‘s/\ . $//g’ 删除以句点结尾行 |
| ‘-e/abcd/d’ 删除包含a b c d的行 |
| ‘s/[ ] [ ] [ ] */[ ]/g’ 删除一个以上空格,用一个空格代替 |
| ‘s/^ [ ] [ ] *//g’ 删除行首空格 |
| ‘s/\ . [ ] [ ] */[ ]/g’ 删除句点后跟两个或更多空格,代之以一个空格 |
| ‘/^ $/d’ 删除空行 |
| ‘s/^ .//g’ 删除第一个字符 |
| ‘s/COL \ ( . . . \ )//g’ 删除紧跟C O L的后三个字母 |
| ‘s/^ \///g’ 从路径中删除第一个\ |
| ‘s/[ ]/[TAB]//g’ 删除所有空格并用t a b键替代 |
| ‘S/^ [TAB]//g’ 删除行首所有t a b键 |
| ‘s/[TAB] *//g’ 删除所有t a b键 |
6、用sed删除文件中的换行符,杀鸡哪需牛刀?
| tr -d ‘\n’ file |
| 真的需要sed |
| |
| sed -nr ‘ H; |
| $ { |
| x; |
| s/\n//g; |
| p |
| }’ |
7、sed获取ip
| [root@c01 ~]# ifconfig eth0|sed -ne ‘s/^.*addr:\([0-9.]*\).*$/\1/p’ |
| 192.168.100.180 |
| |
| [root@c01 ~]# ifconfig eth0 | sed -e ‘/inet/!d’ -e ‘s/.*addr://’ -e ‘s/[ ].*//’ |
| 192.168.100.180 |
8、\
,/
转义字符
| echo /usr/local/bin | sed ‘s/\/usr\/local\/bin/\/common\/bin/’ |
| find . -name “*.html” |xargs sed -i ‘s |
都可以把当前目录下的.c .h文件中的TAB替换成4个空格。
| find . -name “*.[c|h]” | xargs sed -i ‘s/\t/ /g’ |
9、参数f:
以下三个命令相等,先在包含字符串test的任意行上,将111替换成222,再将字符f替换成hello
| $ sed ‘/test/s/111/222/g ; s/f/hello/g’ sample.txt |
| $ sed -e ‘/test/s/111/222/g’ -e ‘s/f/hello/g’ sample.txt |
| 选项-f: 将要执行的所以编译命令放入在文件中 |
| $ more scher |
| /test/s/111/222/g |
| s/f/hello/g’ sample.txt |
| $ sed -f scher sample.txt |
10、参数q: 表示跳离sed。最多与一个地址参数配合。
打印出含有a或b字符的行,一旦遇到数字,即刻停止打印。
| $ sed -n -e ‘/[0-9]/q’ -e ‘/[a b]/p’ |
到china quit
11、参数-i后缀:替换并将源文件备份改后缀
| $ sed -i.bak ‘s/123/efg/g’ a.txt 备份源文件 |
12、参数r:在某行插入文件
| $ sed -i ’2 r readfile.txt’ writefile.txt |
13、参数w:读入文件中的内容存入到另一文件中(temp.txt)。最多与一个地址参数配合。
将sample.txt文件中含test字符串的数据行,copy至temp.txt档中储存(原temp.txt中无内容)
| $ sed -e ‘/test/w temp.txt’ sample.txt |
14、参数y:转换数据中的字符。最多与两个地址参数配合。
| 1.将文件中的小写字母替换成大写字母。 |
| |
| $ sed -e ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ sample.txt |
| 其中前后字符个数必须相同. |
15、参数!:表示不执行函数参数。 将文件中除了important字符串,其余全删除。
| $ sed -e ‘/important/!d’ sample.txt |
16、参数=:表示印出资料的行数。最多与两个地址参数配合。 1.印出文件资料并显示行数。
计算总行数
17、其它参数 参数#:表示对文字的注释。
参数N:表示添加下一笔资料到pattern space内。最多与两个地址参数配合。(添加下一笔:添加一笔资料后,继续添加这个资料的下一行数据到pattern space内) 1,将文件中的数据合并。文件内容如下: UNIX LINUX
| $ sed -e ‘N’ -e’s/\n/\,/g’ sample.txt |
| 结果如下: UNIX,LINUX |
| $ sed -n -e ‘N’ -e ‘P’ sample.txt |
利用N将下一行资料(即:偶数行)添加到pattern space内,在利用P打印出奇数行。 解释过程:由于N的作用,使得每次添加一条资料到pattern space后,先不执行操作,而是继续添加这个资料的下一行到pattern space内, 然后P参数打印出第一行资料。
| 参数h:表示暂存pattern space的内容至hold space(覆盖)。最多与两个地址参数配合。 |
| |
| 参数H:表示暂存pattern space的内容至hold space(添加)。最多与两个地址参数配合。 |
| |
| 参数g:表示将hold space的内容放回至pattern space内。(覆盖掉原pattern space内的数据) |
| |
| 参数G:表示将hold space的内容放回至pattern space内。(添加大到原pattern space数据之后) |
将文件中所有空行删除,并在每一行后面增加一个空行。
| $ sed ‘/^$/d;G’ sample.txt |
将文件中所有空行删除,并在每一行后面增加两个空行。
| $ sed ‘/^$/d;G;G’ sample.txt |
参数x:表示交换hold space与pattern space内的数据。
将文件第三行的数据替换成第一行的数据。
| $ sed -e ’1h’ -e ’3x’ sample.txt |
| 参数b: |
| |
| 参数t: |
| |
| 如果使用sed对文件进行过滤,最好将问题分成几步,分步执行,且边执行边测试结果。 |
| |
| 经验告诉我们,这是执行一个复杂任务的最有效方式。 |
参考:
| http://www.2cto.com/os/201111/112217.html |
| |
| http://markmail.org/download.xqy?id=w5pncjwnrs77lz3s&number=2 |
| |
| http://www.grymoire.com/Unix/Sed.html |
| |
| http://sed.sourceforge.net/sed1line.txt |
转自:
http://www.wallcopper.com/linux/769.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用