sed---流文本操作
一:sed基本命令
sed的使用格式
sed [optiona] ‘command’ files
| sed | 参数[-nefir] | 动作[n1,[n2]] function |
|---|---|---|
| sed | -n:只有经过sed特殊处理的那些行才会被列出来 -e:直接在命令行模式上进行sed的动作编辑 -f:直接将sed的动作写在文件里,-f filename则可以执行filename内的动作 -r:sed的动作支持的是扩展正则表达式,读取指定文件的内容 -i:直接修改读取到的文件的内容,而不是屏幕输出 |
n1,n2一般代表执行动作的行,也可以用正则表达式 function: a:新增 c:替换 d:删除 i:插入行 p:打印 s:替换 |

1:以行为单位新增/删除功能
1:将/etc/passwd.bak的内容列出来并且打印行号,同时删除第2-5行
[root@localhost etc]# nl /etc/passwd.bak |sed '2,5d' #删除2到5行
[root@localhost etc]# nl /etc/passwd.bak |sed '2d' #删除第2行
[root@localhost etc]# nl /etc/passwd.bak |sed '2,$d' #删除2行到最后一行
1 root:x:0:0:root:/root:/bin/bash
[root@localhost tmp]# sed '/^$/d' passwd.bak #删除空行
2:在第二行后面,也就是第3行上,加上“I love batman!”
[root@localhost etc]# nl /etc/passwd.bak | sed '2a I love batman! '
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
I love batman!
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
3:添加多行
nl /etc/passwd.bak | sed '2a I love batman! ... \ [敲一下回车]
> ssssss '
#以'结束多行内容
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
I love batman! ...
ssssss
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
#模式匹配的方式
sed '/2004/a\China' xxxx.txt #希望在2004的下一行添加China
sed '/2004/i\China' xxxx.txt #希望在2004的前一行添加China
4:$:最后一行---在文档最后一行添加I love linux
[root@localhost tmp]# nl passwd.bak | sed '$a I love linx '
2:以行为单位替换/打印
1:将第2-5行的内容替换为“No 2-5 number”
[root@localhost etc]# nl /etc/passwd.bak | sed '2,5c no 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
no 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
...
2:简单直接取出你想要的行数
[root@localhost etc]# nl /etc/passwd.bak | sed '2,5p' #2-5行会重复输出
[root@localhost etc]# nl /etc/passwd.bak | sed -n '2,5p' #加上-n,只输出2-5行
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#模式匹配的方式
[root@localhost etc]# sed -n '/root/p' passwd.bak #把包含murex字符的行输出,别忘记加上-n参数
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3:以行为单位进行部分数据的查找以及替换的功能------可以批量处理配置文件
-s替换:分隔符/,#等等 加g:全局替换
1:直接修改文件的内容
[root@localhost etc]# sed -in 's/n$/\!/g' passwd.bak #将每一行结尾的n替换为!,注意转义
[root@localhost tmp]# ifconfig eno16777728 | sed -n '/inet /p' | sed 's/inet//g' | sed 's/net.*$//' #取出IP地址
4:!取反,不打印某些行
1:不打印5到10行
[root@localhost tmp]# nl passwd.bak | sed -n '5,10!p'
5:定位间隔几行 first~step
1:间隔行输出,输出单行,第一行开始
[root@localhost tmp]# nl passwd.bak |sed -n '1~2p'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologi!
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdow!
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologi!
11 games:x:12:100:games:/usr/games:/sbin/nologi!
13 nobody:x:99:99:Nobody:/:/sbin/nologi!
15 polkitd:x:999:998:User for polkitd:/:/sbin/nologi!
17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologi!
19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologi!
6:以行为单位插入数据
1;在1-5行,每行前插入 I love linux
[root@localhost tmp]# nl passwd.bak | sed '1,5i I love linux'
I love linux
1 root:x:0:0:root:/root:/bin/bash
I love linux
2 bin:x:1:1:bin:/bin:/sbin/nologi!
I love linux
3 daemon:x:2:2:daemon:/sbin:/sbin/nologi!
I love linux
4 adm:x:3:4:adm:/var/adm:/sbin/nologi!
I love linux
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
2:使用\来转义空格,使其对其
[root@localhost tmp]# nl passwd.bak | sed '1,5i\ I love linux'
I love linux
1 root:x:0:0:root:/root:/bin/bash
I love linux
2 bin:x:1:1:bin:/bin:/sbin/nologi!
I love linux
3 daemon:x:2:2:daemon:/sbin:/sbin/nologi!
I love linux
4 adm:x:3:4:adm:/var/adm:/sbin/nologi!
I love linux
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
二:高级操作命令
1:-{} :多个sed命令,用;分开
1:删除5-10行,再进行替换操作
[root@localhost tmp]# nl passwd.bak | sed '{5,10d;s/oracle/root/}'
2: -n:读取下一个输入行(用下一个命令处理)-----{}里面的n
1:操作偶数行-----调第一行的时候,读取出第二行:打印,以此类推
[root@localhost tmp]# nl passwd.bak | sed -n '{n;p}'
[root@localhost tmp]# nl passwd.bak | sed -n '2~2p' #第2行开始,间隔行为2
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 dbus:x:81:81:System message bus:/:/sbin/nologin
16 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 oracle:x:1000:1000:oracle:/home/oracle:/bin/bash
2:操作奇数行
[root@localhost tmp]# nl passwd.bak | sed -n '{p;n}'
[root@localhost tmp]# nl passwd.bak | sed -n '1~2p' #第1行开始,间隔行为2
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
15 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
3:-&:替换固定字符串----替换操作的优化
1:把passwd中的用户后面都添加上4个空格
[root@localhost tmp]# sed 's/^[a-z_-]\+/& /' passwd.bak
root :x:0:0:root:/root:/bin/bash
bin :x:1:1:bin:/bin:/sbin/nologin
daemon :x:2:2:daemon:/sbin:/sbin/nologin
adm :x:3:4:adm:/var/adm:/sbin/nologin
lp :x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync :x:5:0:sync:/sbin:/bin/sync
shutdown :x:6:0:shutdown:/sbin:/sbin/shutdown
4:元字符(\u,\l,\U,\L) :转换为大写,小写:\u,\l对首字母,\U,\L对一串字符
[root@localhost tmp]# sed 's/^[a-z_-]\+/\u&/' passwd.bak #首字母转换为大写
Root:x:0:0:root:/root:/bin/bash
Bin:x:1:1:bin:/bin:/sbin/nologin
Daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost tmp]# sed 's/^[a-z_-]\+/\U&/' passwd.bak #匹配字符串全部转换为大写
[root@localhost tmp]# sed 's/^[a-z_-]\+/\l&/' passwd.bak #首字母转换为小写
[root@localhost tmp]# sed 's/^[a-z_-]\+/\L&/' passwd.bak #匹配字符串首字母转换为小写
5:-( ) : 替换某种(部分)字符串\1,\2
1:获取ip的另一种思路
[root@localhost tmp]# ifconfig eno16777728 |grep netmask| sed 's/\(inet\)\(.*\)\(net.*\)/\2/'
192.168.1.10
[root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'| sed 's/\(inet\)\(.*\)\(net.*\)/\2/' 192.168.1.10
[root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'| sed 's/inet \([0-9.]\+.*\) net.*/\1/ '
192.168.1.10
2:获取passwd种的USER,UID,GID
[root@localhost tmp]# sed 's/\(^[a-z_-]\+\):.*$/\1/' passwd.bak #第一步
[root@localhost tmp]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):.*$/\1:\2/' passwd.bak #第二步
[root@localhost tmp]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/\1:\2:\3/' passwd.bak
root:0:0
bin:1:1
daemon:2:2
adm:3:4
lp:4:7
sync:5:0
shutdown:6:0
halt:7:0
mail:8:12
#### \d判断的不只是0-9,而是一个 Unicode 字符集
6:-r复制指定文件插入到匹配行-----不改变文件内容
-w:复制匹配行拷贝到指定文件里
1:
[root@localhost tmp]# echo -e "123\n456\n789" > 123.txt
[root@localhost tmp]# cat 123.txt
123
456
789
[root@localhost tmp]# echo -e "abc\ndef\nxyz" > abc.txt
[root@localhost tmp]# cat abc.txt
abc
def
xyz
[root@localhost tmp]# sed '1r 123.txt' abc.txt ### 读123.txt这个文件,并插入到abc.txt的第1行中
abc
123
456
789
def
xyz
2:-w:改写内容,把123.txt的第一行写入到abc.txt中
[root@localhost tmp]# sed '1w abc.txt' 123.txt
123
456
789
[root@localhost tmp]# cat abc.txt #abc的原内容会被覆盖
123
7:-q退出
1:到第5行就退出sed
[root@localhost tmp]# nl passwd.bak | sed '5q'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8:识别空格和制表符(tab)
[root@localhost tmp]# cat tab_space.txt
this is tab finish.
this is several space finish.
[root@localhost tmp]# sed -n l tab_space.txt ### -n l是L的小写字母
this is\ttab\tfinish.$
this is several space finish.$
sed---流文本操作的更多相关文章
- 【Linux】linux中文本操作利器grep,awk,sed
grep命令 grep(global search regular expression)是一种强大的文本搜索工具,它可以使用正则表达式搜索文本,并把匹配的行打印出来.平时搜索文本中内容的时候是非常方 ...
- Linux Bash文本操作之sed篇其二
上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...
- Linux Bash文本操作之sed篇其一
作为Linux系统中文本处理的强力工具之一,sed功能强大,用法多变,值得我们好好学习. sed是用于过滤和转换文本的流编辑器. 一般情况下sed把当前处理的行存储在临时缓冲区,按指定命令处理之后将缓 ...
- awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一
awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...
- UNIX 系统上的文本操作简介
http://www.oschina.net/question/129540_53561 UNIX 的基本哲学之一就是创建只做一件事并将这一件事做好的程序(或进程).这一哲学要求认真考虑接口以及结合这 ...
- linux 常用文本操作相关命令
平时工作经常会对文本进行相关操作,包括读写.替换.统计等等,借此整理和学习一下有关命令. 1. cat 查看文件中的内容, -n 查看时为每一行加编号; -b 和-n类似,只不过对于空白行不编号: 2 ...
- Linux三剑客之sed流编辑器
一.功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. 二.语法格式 Usage: sed [options] [se ...
- Linux命令-文件文本操作grep
文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...
- IO流(四)__流的操作规律总结
流的操作规律: 1.明确源和目的 源:InputStream Reader 目的:OutputStream Writer 2.明确数据是否是纯文本数据 源:是纯文本:Reader 否:InputStr ...
- C# IO流的操作
C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...
随机推荐
- idea 远程代码调试
声明一点:重要的事情说3遍 本地代码和服务器代码必须一致 本地代码和服务器代码必须一致 本地代码和服务器代码必须一致 第一步,创建remote 第二步.填写服务器信息 第三部.tomcat/bin/s ...
- Node.js自学完全总结
零.什么是Node.js? 引用Node.js官方网站的解释如下: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript e ...
- shell脚本--监控java进程存活脚本
#!/bin/bash base_dir=/opt war_processor="tomcat" jar_processor="manager-server.jar pl ...
- koa 基础(六)应用级路由中间件
1.应用级路由中间件 app.js /** * 应用级路由中间件 */ // 引入模块 const Koa = require('koa'); const router = require('koa- ...
- koa 基础(四)get 传值 以及获取 get 传值
1.get 传值 以及获取 get 传值 app.js /** * get 传值 以及获取 get 传值 */ // 引入模块 const Koa = require('koa'); const ro ...
- HTML页面间传值
页面一: window.location="./showUserMsg.html?IDno="+IDno+"&&thedate="+thedat ...
- Struts ognl表达式语言几个符号
# 获取非根元素值 . 动态都建map集合 $ 配置文件取值 % 提供一个ognl表达式运行环境 <%@ page language="java" import=&q ...
- java.sql.SQLException: Listener refused the connection with the following error: ORA-12505, TNS:list
package DisplayAuthors; import java.sql.*; public class DisplayAuthors { private static final Str ...
- 有效使用Django的QuerySets
对象关系映射 (ORM) 使得与SQL数据库交互更为简单,不过也被认为效率不高,比原始的SQL要慢. 要有效的使用ORM,意味着需要多少要明白它是如何查询数据库的.本文我将重点介绍如何有效使用 Dja ...
- 2019.12.04 ADT on eclipse 配置篇
今天看JerryWang的简书博客https://www.jianshu.com/p/74ad8e4bbc49 ,SAP GUI 和ADT是互为补充的关系,有很多SAP新出的技术都没有办法在GUI上开 ...