sed知识及常用用法梳理
1.sed命令简介及其参数说明
sed流编辑器,擅长对文本进行增删改查,过滤指定的字符串和取指定行,也可以在行中字符串前后插入内容,功能非常强大.
注意:sed默认只支持基本的正则表达式,如果要想支持扩展的正则表达式,要加 \ 转义或加 -r 参数.
sed命令的语法及常用选项:
sed [OPTION]... {script-only-if-no-other-script} [input-file]
选项 sed内置命令符 文本文件
| 选项 | 选项说明 |
| -n |
取消默认输出,只打印被sed处理的行;注意不能和-i参数同时使用 (sed类似cat,不加-n会输出所有内容) |
| -e | 使用-e可以多次编辑,但要注意顺序会影响编辑的结果 |
| -r | 使用此参数后,配合使用正则表达式无需\转义(识别扩展正则表达式) |
| -i | 直接修改(替换)文本内容,不在屏幕输出显示(注意:-n和-i参数不能同时使用,同时使用会将文件内容清空) |
| -i.bak | 更改前先备份.bak为备份文件的后缀,后缀可以随意给 |
sed的内置命令符常用于实现对文本的操作功能,如增删改查等:
| 内置命令符 | 说明 |
| a | append,在指定行后添加一行或多行文本; $a 在末行添加(使用\n可换行以实现多次添加) |
| d | delete,删除指定行(删除多行使用,逗号分隔;删除不连续行使用;分号分隔,如3d;5d) |
| p | print,打印匹配到的行,有时候会和-n参数配合使用 |
| s | 用一个字符串替换另一个字符串 |
| g | global,在行内进行全局替换 |
| i | insert,在指定行前添加一行或者多行文本(使用\n可换行以实现多次插入) |
2. sed常用用法示例
以下文本为测试文件.
[root@test ~]# cat a.txt
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
2.1 打印行p
[root@test ~]# sed -n '/libai/p' a.txt #<==打印字符串所在行
104 libai hubei 999 1000 777
[root@test ~]# sed -n '1,2p' a.txt #<==按照行号打印行,打印连续行,如果打印不连续的行,需使用分号;隔开,且每行都要有p(如1p;3p)
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
[root@test ~]# ifconfig eth0|sed -nr 's/^.*net (.*) net.*$/\1/gp' #<==c7.x中,gp配合使用,常用用法
10.0.0.30
[root@test ~]# ifconfig eth0|awk -F '[ ]+' 'NR==2 {print $3}' #<==awk取法
2.2 删除行d
[root@test ~]# sed '/zhangsan/d' a.txt #<==删除包含指定字符串的所有行(缓存中删除)
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
[root@test ~]# sed '3d' a.txt #<==删除指定行(缓存中删除)
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
[root@test ~]# sed '2,5d' a.txt #<==删除2,3,4,5行,连续多行删除
101 zhangsan guangdong 333 555
[root@test ~]# sed -i '4d' a.txt #<==真正删除内容
[root@test ~]# sed '3,$d' a.txt #<===删除第3行至末尾,剩下的都被打印显示
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
[root@test ~]# sed '/^$/d' a.txt #<==删除空行
2.3 替换字符串s,配合g可进行全局替换
[root@test ~]# sed 's/libai/libaibai/g' a.txt #<==全局替换单个字符串单词
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libaibai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
[root@test ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #<==系统优化选项
[root@test ~]# cat b.txt #<==如果没有g全局替换,默认是将每一行的第一个匹配的字符串替换
1111 BBBBB CCCCC 1111
AAAA 2222 3333 1111 DDDD 1111
[root@test ~]# sed 's/1111/EEEE/' b.txt
EEEE BBBBB CCCCC 1111
AAAA 2222 3333 EEEE DDDD 1111
[root@test ~]# sed -n 's/^101/DDD/p' a.txt #<==只有匹配了101并替换才会打印此行
DDD zhangsan guangdong 333 555
[root@test ~]# ifconfig eth0|sed -nr 's/^.*net (.*) net.*$/\1/gp' #<==替换并打印IP地址
10.0.0.30
2.4 增加/插入内容a/i
注意:内置命令符 a 增加内容是在行后增加行; i 插入内容是在行前;增加行时,都是在原有内容基础上增加行,增加的行替换掉原有的行.
[root@test ~]# sed '3a 103.3 liubei sichuang 456 123 789' a.txt #<==在指定行后增加内容
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
103.3 liubei sichuang 456 123 789
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555 [root@test ~]# sed -i '3a 103.3 liubei sichuang 456 123 789' a.txt #<==真正增加内容
[root@test ~]# sed -i.bak '3a 103.3 liubei sichuang 456 123 789' a.txt #<==更改前先备份文件
[root@test ~]# sed '2i 101.1 liubei sichuang 444 556 111' a.txt #<==插入内容到第2行
101 zhangsan guangdong 333 555
101.1 liubei sichuang 444 556 111
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555 [root@test ~]# sed -i '2i 101.1 liubei sichuang 444 556 111' a.txt #<==真正插入内容
[root@test ~]# sed -i '$a 101.1 asdds ddd' a.txt #<==将内容插入至文本末尾行
[root@test ~]# sed 's/lisi/nihao &/' a.txt #<==在指定字符串(文本中唯一)前插入内容,注意看情况是否添加空格
101 zhangsan guangdong 333 555
102 nihao lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555 [root@test ~]# sed 's/lisi/& nihao/' a.txt #<==在指定字符串(文本中唯一)后插入内容,注意看情况是否添加空格
101 zhangsan guangdong 333 555
102 lisi nihao guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
[root@test ~]# sed 's/rhgb/& crashkernel=auto biosdevname=0 net.ifnames=0/' /etc/sysconfig/grub.bak #<==c7.x系统优化内核实例
[root@test ~]# sed '3 s/wangyi/& test/' a.txt #<==指定行号,在某个字符串后插入内容
[root@test ~]# sed 's/^/HEAD&/' a.txt #<==在每行行头添加内容
HEAD101 zhangsan guangdong 333 555
HEAD102 lisi guangxi 444 555 666
HEAD103 wangyi hunan 111 222 333
HEAD104 libai hubei 999 1000 777
HEAD105 dupu beijing 11122 3333222 5555
[root@test ~]# sed 's/$/&HEAD/' a.txt #<==在每行行尾添加内容
101 zhangsan guangdong 333 555HEAD
102 lisi guangxi 444 555 666HEAD
103 wangyi hunan 111 222 333HEAD
104 libai hubei 999 1000 777HEAD
105 dupu beijing 11122 3333222 5555HEAD
######替换指定行内容
[root@ceph-node1 ~]# cat a.txt
101 zhangsan guangdong 333 555
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
[root@ceph-node1 ~]# sed -i '/^101/c 1000000000' a.txt #<==c表示change
[root@ceph-node1 ~]# cat a.txt
1000000000
102 lisi guangxi 444 555 666
103 wangyi hunan 111 222 333
104 libai hubei 999 1000 777
105 dupu beijing 11122 3333222 5555
2.5 sed反向引用示例
[root@test ~]# echo {1..10}|sed -r 's#([0-9]+)#<\1>#g'
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10>
[root@test ~]# tail -5 /etc/passwd >a.txt
[root@test ~]# cat a.txt
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
[root@test ~]# sed -r 's#(^.*)(:x.*:)(.*$)#\1#g' a.txt
tss
abrt
sshd
postfix
ntp
[root@test ~]# sed -r 's#(^.*)(:x.*:)(.*$)#\2#g' a.txt
:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:
:x:173:173::/etc/abrt:
:x:74:74:Privilege-separated SSH:/var/empty/sshd:
:x:89:89::/var/spool/postfix:
:x:38:38::/etc/ntp:
[root@test ~]# sed -r 's#(^.*)(:x.*:)(.*$)#\3#g' a.txt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
[root@test ~]# stat /etc/hosts |sed -nr '4 s#^.*\(([0-9]+)/.*$#\1#gp'
0644
[root@localhost ~]# echo "aaa bbb" >a.txt
[root@localhost ~]# sed -r 's#([:lower:]){3} ([:lower:]{3})#\1 \2#g' a.txt
aaa bbb
sed知识及常用用法梳理的更多相关文章
- grep知识及常用用法梳理
1. grep语法及其参数说明 grep是文本搜索工具,能根据用户指定的'PATTERN模式'目标文本进行逐行匹配检查,注意grep默认会以 行 为单位打印匹配到的行. 以下是grep命令的语法及常用 ...
- 预备知识-python核心用法常用数据分析库(上)
1.预备知识-python核心用法常用数据分析库(上) 目录 1.预备知识-python核心用法常用数据分析库(上) 概述 实验环境 任务一:环境安装与配置 [实验目标] [实验步骤] 任务二:Pan ...
- grep参数说明及常用用法
grep参数说明及常用用法 趁着午休的时间把自己经常使用的一些grep命令整理一下. 方便以后查看. 后续会逐步把awk/sed/find等常用的命令理一理. 增强下记忆. 也算是对得起自己了. ^^ ...
- sed的N;P用法
sed的N;P用法 原文地址 这里介绍的是sed的一个多行模式的使用,一开始对sed中命令N的用法不是很理解,经过多次尝试,通过几个例子对N的用法进行总结: N即Next,它同n(next)的区别是: ...
- sed工具的基本用法
sed文本处理工具的用法: 用法1:前置命令 | sed [选项] '条件指令' 用法2:sed [选项] '条件指令' 文件.. .. 认识sed工具的基本选项 sed命令的常用选项如下: -n(屏 ...
- Linux常用命令梳理——文件管理(一)
由于本人目前仍是萌新一枚,所以<Linux常用命令梳理>系列仅依照个人目前掌握的知识,对一部分命令进行梳理,目的是为了对之前学到的知识进行巩固.当然了,如果机缘巧合被大家看到了,也欢迎各位 ...
- centos的vi常用用法
centos的vi常用用法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...
- linux sed命令参数及用法详解
linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...
- MySql与SqlServer的一些常用用法的差别
MySql与SqlServer的一些常用用法的差别 本文为转载 本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] ...
随机推荐
- vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架
自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...
- 【javaScript】js出现allocation size overflow以及字符串拼接优化
字符串拼接长一点了,就出现了allocation size overflow异常! 先创建缓冲字符串数组,最后将数组转化为字符串 <script type="text/javascri ...
- 18年第一弹射 和网络有关; 艾曲塞嗯诶系列篇 san
62: 管理员想要更新 AR2200路由器的VRP, 正确的方法: 1)管理员把 AR2200 配置为FTP客户端,通过FTP来传输VRP软件 2)管理员把AR2200 配置为FTP服务器,通过FTP ...
- mongo 查询 距离 某个点 多少 米距离 感谢 提供的数据。 感谢 mvc的 demo 。反正 就是各种感谢 文档之类的。
昨天 去面试来着, 问了一下mong . 我记得mong支持 地理位置索引的,说了一下. 然后 面试官说 查询某个点 的 多少米范围, 这个该怎么实现? 我懵逼了.... 回去 查询了一下. 发现有 ...
- 创建dynamics CRM client-side (十一) - 管理和关联所有的JS文件
代码管理是一个无法避免的问题. 前面我也建议了大家每一个entity都应该拥有自身的js. 但是如果我们有一些global的function, 我们应该怎样去部署到每一个entity中呢? 我这里使用 ...
- kali linux下的部分命令
查看发行版本 cat /etc/issue cat /etc/*-release 查看内核版本 uname -a 显示机器的处理器架构 arch uname -m 清屏 clear 命令行 ...
- jenkins 与 gitlab 的持续集成
前言介绍 gitlab与jenkins的安装部署请参考之前的文章:这里介绍一下jenkins与gitlab结合的好处. gitlab可以自己实现CICD功能,jenkins也可以结合其他工具来实现CI ...
- 缓存 ehcache
只是用于自己记录,防止日后忘记,回看所用 第一步:配置ehcahe 缓存 <?xml version="1.0" encoding="UTF-8"?> ...
- Leetcode 题目整理-4 Longest Common Prefix & Remove Nth Node From End of List
14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...
- Ubuntu 入门笔记(1)
在阿里云上申请了一个云服务器,开始学习Linux.我选择的是Ubuntu 14.04 ,在登录时就绕了我好长时间,输入用户名是有显示的,但是输入密码就没有反应了,查找了之后才发现原来这是Ubuntu ...