LINUX SHELL的神器,sed

我们知道,Vim 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但本节要讲的 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。

sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  1. 每次仅读取一行内容;

  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;

  3. 将执行结果输出。

当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

1. sed 命令格式

1.1 sed的语法命令格式:

sed [选项] sed编辑命令 输入文件
shell 命令 | sed [选项] sed编辑命令、
sed [选项] -f sed脚本文件 输入文件

1.2 sed的常用选项:

-n:只显示匹配处理的行(否则会输出所有)
-e:执行多个编辑命令时(一般用;代替)
-i:直接在文件中进行修改,而不是输出到屏幕(此时不要接-n或-p命令,会导致源文件出问题)
-r:支持扩展正则表达式
-f:从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开)

1.3 sed的常用编辑命令:

p:打印匹配行 print
d:删除指定行 delete
a:在匹配行后面追加 append
i:在匹配行前面插入 insert
c:整行替换
r:将文件的内容读入 read
w:将文本写入文件 write
s:字符串替换(匹配正则表达式)substitution

1.4 sed的p命令示例:

sed -n '1,2p'  /etc/passwd   显示前面两行
sed -n '2,3p'  /etc/passwd   显示2到3行
sed -n '10p'  /etc/passwd    显示第10行
sed -n '$p' /etc/passwd    显示最后1行
sed -n '2,+2p' /etc/passwd   显示234行
sed -n '3,100!p' /etc/passwd  显示1到2行
sed -n '1p;3p;5p'  /etc/passwd  显示1,3,5,行

2. sed 模式

sed -n ‘/模式/p’ 输入文件
这里的模式可以是正则表达式也可以是精确字符
模式用/括起,扩展正则要加 -r选项
sed -n ‘/bash/p’ /etc/passwd
显示包含bash的行
sed -rn ‘/^#/!p’ /etc/grub.conf
不显示#号开头的
sed -n ‘/\/$/p’
显示以/结尾的行
sed -n ‘/^[a-z]/p’
显示以字母开头的行

PS:

#cat -n file.txt|sed -n '1~2p'
显示单数行,~表示步长

执行结果:

1  #include "stdio.h"3  #define MAX 105  //char array[MAX] = { [0 ...(MAX-1)] = '8' };79          for(int i = 0; i< MAX; i++)11          return 0;

显示偶数行

#cat -n file.txt|sed -n '0~2p'

执行输出:

246  char array[MAX] = {'A'};8  int main(void){10                  printf("array[%d]=%c\n",i,array[i]);12  }

sed里单引号和双引号的区别:

双引号里可以使用shell里的变量,单引号不能;
单引号和双引号里都可以存放模式。

3. sed的d命令示例

删除操作可以根据行号和模式匹配进行操作

sed  '3,5d' /etc/fstab  
删除3到5行
sed '/2/d' /etc/fstab
删除包含数字2的行
sed '/ext3/!d' /etc/fstab
除了包含ext3的行都删除
sed -r '/^$|^#/d' /etc/inittab

删除空行和注释

sed -e '/^$/d' -e '/^#/d' /etc/vsftpd/vsftpd.conf
sed '/^$/d  ;   /^#/d' /etc/vsftpd/vsftpd.conf

3.1 sed的a命令示例:

追加操作可以根据行号和模式匹配进行操作 :

sed '1a 1111111111111111' /etc/fstab
在第一行后面追加后面的字符串
sed '/boot/a 1111111111111' /etc/fstab
在包含boot的行下面追加后面的字符串

3.2 sed的i命令示例

插入操作可以根据行号和模式匹配进行操作 :

sed '$i 1111111111111111' /etc/fstab
在最后一行前面插入后面的字符串
sed '/defaults/i 1111111111111' /etc/fstab
在包含defaults的行前面插入后面的字符串

3.3 sed的c命令示例

更改整行操作可以根据行号和模式匹配进行操作

sed ‘/id:/c id:5:initdefault:' /etc/inittab
将id:所在的行整行替换成后面的字符串
sed '3c ONBOOT=no' ifcfg-eth0
将第三行改成后面的字符串

3.4 sed的r命令示例

读入操作可以根据行号和模式匹配进行操作

sed ‘$r /etc/hosts' /etc/fstab
在fstab文件的末尾后面读入hosts文件的所有内容
df -h | sed '/dev\/sda1/r /etc/mtab‘
在/dev/sda1后面读入mtab文件的内容

3.5 sed的w命令示例(w命令不加-i也是直接修改原文件!!)

写入文件操作可以根据行号和模式匹配进行操作

sed '1w abc.txt' /etc/passwd
将文件的第一行写到abc.txt(和r命令正好相反)
sed '/^#/!w abc.txt' /etc/inittab
将所有不是#开头的行都写入abc.txt
sed -r '/^#|^$/!w  abc.txt' /etc/vsftpd/vsftpd.conf
将配置文件中除了空行和注释都写入abc.txt

所以,对于sed的w命令,建议使用grep命令,然后追加到文件。

3.6 sed的s命令

格式:sed -n [行号或模式]s/查找内容/替换内容/[替换标记] 文件 替换操作可以根据行号和模式匹配进行操作 替换标记有四种

数字:替换每行的第几个
g:全局替换,否则只替换第一个字符串。例如ng从第n个开始替换
p:显示被执行替换操作的行和-n合用
w:将执行替换操作的行输出到指定文件
sed的s命令
sed -n 's/root/ROOT/2p' /etc/passwd
将文件中每行的第2个root替换为ROOT
sed '/^id/s/3/5/' /etc/inittab
将文件中找到以id开头的行中的:3:替换成:5:(先用^id找出行)
sed  '/^local_enable/s/YES/NO/'  vsftpd.conf
禁止本地用户登陆
sed 's/:/\n/g' /etc/passwd
将文件中的:号替换为换行符
sed 's/bash/nologin/ ; s/sbin/bin/' /etc/passwd
将文件中bash替换成nologin,同时将sbin替换成bin
sed -n '2,10s/^/#/p' /etc/passwd
在2到10行前面加上注释
sed -n ‘s/$/?/p' /etc/passwd
在每行末尾加上问号

sed的s命令可以使用任意分隔符作为定界符

sed  -n '/^hello/s|/bin/bash|/sbin/nologin|p' /etc/passwd
sed  -n '/^hello/s:/bin/bash:/sbin/nologin:p' /etc/passwd

注意:

-i选项是直接修改文件,小心使用 !!!
sed -i '/模式/s/源字符/替换成/g' 文件名

4 练习

1.sed取出/etc/passwd文件的第一列
2.sed将PATH环境变量中的冒号换成换行
3.sed将PATH环境变量斜杠/换成斜杠\
4.sed修改SELINUX配置文件从开启变成禁用(/etc/sysconfig/selinux)
5.去掉/etc/passwd文件中第二个地段的x
6.修改/etc/inittab文件里的3或者5修改为6
7.编写一个脚本实现修改ip地址:
7.1.提醒用户输入ip地址和子网掩码、dns、网关
7.2.需要判断新输入的ip地址是否有人使用,如果有人使用这个ip地址,就不能去修改ip,并且提示。
7.3.刷新网络服务,让新的ip地址生效。

答案:

1.# cat passwd|sed -r 's/(^[0-Z]+)(.*)/\1/'   --》\1表示第一个标签
2.# echo $PATH|sed 's/:/\n/g'
3.# echo $PATH|sed -r 's/\//\\/g'
或者# echo $PATH|sed -r 's#/#\\#g'(以#作分界符)
4.# cat selinux|sed  '/^SELINUX=/s/enforcing/disabled/g'
5.# awk -F:   '{print $1":"$3":"$4":"$6":"$7}' passwd
或者:# awk -F: ' OFS=":"{print $1,$3,$4,$5,$6,$7}' passwd --》OFS指定分隔符
或者:# cat passwd|sed 's/:x:/::/g'
6.# cat inittab |sed -r '/^id/s/:[35]:/:6:/g'
7.
#!/bin/bashread -p "Please input the ip:" IP
read -p "Please input the netmask:" MASK
read -p "Please input the dns server:" DNS
read -p "Please input the gateway:" GATEWAYa=$(cat ifcfg-eth0|grep "IPADDR"|cut -d '=' -f2)
if [[ $IP == $a ]]
thenecho "The IP:$IP is exist!!!"
elsesed -i "{/IPADDR/c IPADDR=$IP/NETMASK/c NETMASK=$MASK/DNS1/c DNS1=$DNS/GATEWAY/c GATEWAY=$GATEWAY}" /lianxi/ifcfg-eth0echo "The IP is alter:$IP"
fi

内容大部分来自:

http://c.biancheng.net/view/4028.html

https://blog.csdn.net/qq_18312025/article/details/78231015

https://www.gnu.org/software/sed/manual/sed.html#Multiline-techniques

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql使用shell脚本部署_shell脚本部署mysql主从

centos6两台Master IP&#xff1a;192.168.88.152Slave IP&#xff1a;192.168.88.153以下都是在主机上操作两机配置免密登录ssh-keygen -t rsassh-copy-id root192.168.88.153编写mysql_master脚本vim mysql_mster.sh#!/bin/bashservice iptables stopsetenforce 0yum -y inst…

ES6 数组、对象的扩展

8. 数组的扩展 扩展运算符&#xff08;...&#xff09;&#xff0c;将一个数组转为用逗号分隔的参数序列。 复制数组 const a2[...a1]合并数组 [...arr1, ...arr2, ...arr3]; arr1.concat(arr2, arr3);// ES5 的合并数组 这是浅拷贝,如果修改了原数组的成员&#xff0c;会同步反…

MVVM及MVVMLight相关资料

&#xff08;1&#xff09;dwahlin (2)http://blog.csdn.net/duanzilin/article/category/816515

我损失几百万换来的教训

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;看到朱老师一篇抉择影响人生走向的文章&#xff0c;文中的我是作者本人。---我2009年初开始工作&#xff0c;2010年离开苏州来到深圳&#xff0c;那时候深圳的房价其实还不高&#xff0c;至少在全国来说深圳的房价还远没有现…

strcat()

把源字符串 连接 到目的字符串的后面。目的字符串的长度要足够长 char *strcat(char *dest, const char *src) {assert((NULL ! dest) && (NULL ! src));char *cp dest;while (*cp ! \0){cp;}while ((*cp *src) ! \0){;}return dest; }

android mysql 图片_android sqlite添加图片到数据库

sqlite图片是怎么储存的呢&#xff1f;其实是二进制的方式存储的blob代表使用二进制储存 (更多类型参考&#xff1a;数据库简介)在创建表的地方,VALUE_PIC代表存储图片字段&#xff0c;blob代表这个字段是以二进制储存的。/*创建表语句 语句对大小写不敏感 create table 表名(字…

MCU为什么内部不集成晶振

01MCU为什么不集成晶振本文将用STM32代替MCU。原因1&#xff1a;早些年&#xff0c;芯片的生产制作工艺也许还不能够将晶振做进芯片内部&#xff0c;但是现在可以了。这个问题主要还是实用性和成本决定的。实用性&#xff1a;如果封装进入STM32内部&#xff0c;不利于不同客户更…

[JSOI2007]建筑抢修 (贪心)

题目链接 Solution 可以考虑 \(dp\) ,但是很显然 \((n^2)\) 降不下来. 然后考虑贪心,首先,绝对的正确的是,在同等的情况下,给后面的留更多的时间. 首先按照 \(T_2\) 排序. 然后我们维护一个大根堆 每修理一栋建筑 我们就把这栋建筑的T1值加入堆 若当前无法修理 我们判断堆顶是否…

cad中怎么随意移动图形_cad中怎么随意移动图形_绘制CAD图纸的过程中CAD快捷键失灵了怎么办?...

很多人在使用笔记本绘制CAD图纸的过程中&#xff0c;当用到CAD快捷键的时候会发现部分CAD快捷键无法正常使用&#xff0c;比如按F8后并没有切换成正交状态&#xff0c;而是出来了连接投影仪的选项&#xff0c;而且其他的快捷键也无法使用了&#xff0c;如下图所示。在以前老的笔…

strcmp()

比较2个字符串&#xff0c;返回2个字符串的差值 int strcmp(const char *str1, const char *str2) {assert((NULL ! str1) && (NULL ! str2));while(*str1 && *str2 && (*str1 *str2)){str1;str2;}return (*str1 - *str2); }

元旦加班

因为项目紧张&#xff0c;元旦加班了&#xff0c;这是在腾讯的第二次节假日加班。相对于害怕加班&#xff0c;我也害怕一段时间一段时间的浪费光阴一事无成&#xff0c;更害怕一段时间&#xff0c;一段时间加班后也是一事无成。加班有时候也挺舒服的&#xff0c;为了给乌托邦的…

MySQL中修改表结构的关键字_下列SQL语句中,修改表结构的关键字是

【单选题】对《将进酒》全诗分析不正确的是【单选题】下列划线词语的解释有误的一项是【多选题】下列食品属于不完全蛋白质的是 ( ) 。【单选题】下列聚合函数中属性列必须是数值型的是【单选题】( )体现了商品生产者之间相互交换的劳动关系。【单选题】在SELECT语句中使用SUM(…

strncpy()

char *strncpy(char *dest, const char *src, unsigned int count) {assert((NULL ! dest) && (NULL ! dsrc));char *ret dest;if (0 count){return dest;}while (count-- > 0){if (!(*ret *src)) //\0{return dest;}}*ret \0;//切记!!!!!return dest; }

远程用power shell 管理vmware view 池用户

1. 在客户端安装POWER SHELL V2.0的系统补丁&#xff0c;补丁号码为KB968930&#xff0c;里面包括了winrm和powershell 2.0 2. 将view connection server服务器设置为winrm的信任主机&#xff1a; PS C:\ set-item wsman:\localhost\Client\TrustedHosts -value IP为了能在计…

GitHub的嵌入式开源项目

来源&#xff1a;嵌入式大杂烩关于GitHub&#xff0c;可能很多人误以为这是互联网人的专属&#xff0c;其实并不是&#xff0c;那上面嵌入式相关的开源项目是有很多的。现分享一些高星开源项目&#xff08;像RT-Thread、AWTK等大家都熟知的就不介绍了&#xff09;&#xff1a;A…

项目开发日志:Build AssetBundle——SpriteAtlas(已解惑)

项目信息&#xff1a;平台-AndroidUnity编辑器版本-2018.2.5f1状况1&#xff1a;真机状况下引用到图集下的sprite的UI显示出错。&#xff08;图集被打成AB包且勾选了Include in Build&#xff09;.在我们的测试下发现了以下两个解决方案&#xff1a;&#xff08;当然我觉得第二…

strncat()

将源字符串的前count个字符拷贝到目的字符串中 char *strncat(char *dest, const char *src, size_t count) {assert((NULL ! dest) && (NULL ! dsrc));char *cp dest;if (0 count)//返回原来的{return dest;}while (*cp ! \0){cp ;}while (count-- > 0){if (!(*c…

Sangfor上网行为管理单点登录配置

单点登录功能介绍&#xff1a; 当用户成功登录到第三方认证服务器时&#xff0c;自动通过AC的认证&#xff0c;而无需再次输入用户名和密码。 优点&#xff1a; 用户只需要输入一次账号和密码&#xff0c;即可自动通过AC的认证&#xff0c;避免账号和密码的重复输入&#xff0c…

教你精确计算 I2C 上拉电阻阻值

I2C 总线能挂多少设备&#xff1f;理论上&#xff1a;7-bit address &#xff1a;2 的 7 次方&#xff0c;能挂 128 个设备。10-bit address &#xff1a;2 的 10 次方&#xff0c;能挂 1024 个设备。当然&#xff0c;要把预留设备地址去除&#xff0c;7 bit 协议规定了 8个预留…

原型设计+用户规格说明书

用户规格说明书 作业链接&#xff1a;https://edu.cnblogs.com/campus/fzzcxy/2016SE/homework/2180 原型模型设计工具&#xff1a; 墨刀 原型模型链接&#xff1a;https://modao.cc/app/6a5fcc03e409ffe37cfcdb9cb06914271744f131 学号1&#xff1a;362 何永康 学号2&#xff…