SHELL中sed总结

一.Sed定义

sed命令是将一系列的编辑命令应用于一批文本的理想工具。sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间。本节将介绍sed命令的基础知识。

二.sed的基本语法

sed  OPTIONS…  '[ 动作 ]' [ 文件名 ]
常用的选项:
-n,–quiet: 不输出模式空间中的内容
-i: 直接编辑原文件,默认不对原文件进行操作
-e: 可以使用多个命令(脚本)进行操作
-f /path/from/sed_script: 以选项中指定的 script 文件来处理输入的文本文件。
-r: 使用扩展正则表达式

三.sed 地址定界

(1) # :#为数字,指定要进行处理操作的行         sed -n '2 p' /etc/passwd

(2)   $:表示最后一行.    sed -n '$ p' /etc/passwd

(3)  /regexp/:表示能够被regexp匹配到的行 sed -n '/root/ p' /etc/passwd

       regexp及基于正则表达式的匹配

      /regexp/I:忽略大小写

(4)  /regexp/:从起始行开始到第一次能够被regexp匹配到的行

sed -n '1,/bin/ p'        /etc/passwd

(5) first~step:指定起始的位置及步长

sed -n '1~3 p' /etc/passwd

从第一行开始每隔3行显示一行内容

(6)

addr1,+N:指定行以及以后的N

addr1,~N:指定行开始的N

四.sed常用编辑命令
 

(1) d:删除匹配到的行

sed 'd'   /etc/passwd        删除全部
sed '3d'  /etc/passwd       删除第三行
sed '2,5d' /etc/passwd      删除第二行到第五行
sed '/1/,/3/d' /etc/passwd   删除一到三行
sed '3,$d'   /etc/passwd     删除第三行到结束
(2) p : 打印模式空间中的内容
         sed -n '1,3 p' /etc/passwd
(3) a \text:  append,表示在匹配到的行之后追加内容
    sed '/root/ a this is root ' /etc/passwd
(4)i \text: insert,表示在匹配到的行之前追加内容
   sed '3i this is root' /etc/passwd

(5)c \text: change,表示把匹配到的行和给定的文本进行交换-----行替换
sed '3c this is text' /etc/passwd
(6)  s/regexp/text/flages :查找替换 , text 替换为 regexp 匹配到的内容
常用的flages有:
g :全局替换,默认只替换第一个
i : 不区分大小写
p :如果成功替换则打印
例子:.对文本文件需要对里面的第十二行aaa字符串进行替换成bbb应该要怎么命令操作
sed '12s/aaa/bbb/p ' /text
(7)w 标记会将匹配后的结果保存到指定文件中
sed '12s/aaa/bbb/w test.txt ' /text
cat test.txt
bbb

五.sed扩展

特殊符号 介绍说明

! 对指定行意外的所有行应用命令                   sed '3,$ ! d' /etc/passwd
= 打印当前行行号                                            sed -n '=' a.sh
& 代表被替换的内容
; 实现一行命令语句可以执行多条 sed 命令 1p;2p;5p
{} 对单个地址或范围执行批量操作 { 将多个规则,或者多个命令放在大括号通过;隔开 }
+ 地址访问内用到的符号,做加法运算
-e 可以指定多个表达式 [root@localhost ~]# sed -n -e '1 s/root/ROOT/p' -e '2,3 p'
/etc/passwd
-n ** 打印当前模式空间内容,然后读取下一行并替代当前模式空间的内容。如果读取不到下一行 sed 则会 不运行之后的命令 ** (读取指定行通过下一行覆盖该内容只对下一行进行处理)
-N ** 读取下一行并且附加到当前模式空间内,如果读取不到下一行 sed 则会不运行之后的命令 ** (可以在
模式空间同时读取两行内容进行处理)
例题:
1 、把 /etc/passwd 复制到 /root/test.txt ,用 sed 打印所有行;
[root@172 ~] # sed '1,$ w /root/test.txt' /etc/passwd
[root@172 ~] # sed -n -e 'p' -e'w ./t1.txt' /etc/passwd
2 、打印 test.txt 3 10 ;
[root@172 ~] # sed -n '3,10p' test.txt
3 、打印 test.txt 中包含 ’root’ 的行;
[root@172 ~] # sed -n '/root/p' test.txt
4 、删除 test.txt 15 行以及以后所有行;
[root@172 ~] # sed '15,$d' test.txt
5 、删除 test.txt 中包含 ’bash’ 的行;
[root@172 ~] # sed '/bash/d' test.txt
6 、替换 test.txt ’root’ ’toor’
[root@172 ~] # sed -n 's/root/toor/g p' test.txt
7 、替换 test.txt ’/sbin/nologin’ ’/bin/login’
sed 's/\/sbin\/nologin/\/bin\/login/g' test.txt
8 、删除 test.txt 5 10 行中所有的数字;
[root@172 ~] # sed -nr '5,10 s/[0-9]+//g p' test.txt
[root@172 ~] # sed -nr '5,10 s/[0-9]*//g p' test.txt
9 、删除 test.txt 中所有特殊字符(除了数字以及大小写字母);
[root@172 ~] # sed -nr 's/[[:punct:]]//g p' test.txt
10 、在 test.txt 20 行到末行最前面加 ’aaa:’
[root@172 ~] # sed '20,$ i aaa:' test.txt
11 、删除 centos7 系统 /etc/grub2.cfg 文件中所有以空白开头的行行首的空白字符
[root@172 ~] # sed 's/^[ ]*//' /etc/grub2.cfg
12 、删除 /etc/fstab 文件中所有以 '#' 开头,后面至少跟一个空白字符的行的行首的 '#' 和空白
字符
[root@172 ~] # sed -r 's/^#[ ]//' /etc/fstab
13 、在 centos6 系统 /root/install.log 每一行行首增加 '#' [root@centos6 ~] # sed -n 's/^/#/p' install.log
[root@centos6 ~] # sed -rn 's/(^.*)/#\1/p' install.log
14 、在 /etc/fstab 文件中不以 '#' 开头的行的行首增加 '#'
[root@172 ~] # sed 's/^[^#]/#/' /etc/grub2.cfg
15 、处理 /etc/fstab 路径 , 使用 grep sed 命令取出其目录名和基名
[root@centos7 data] #echo /etc/fstab | sed -nr 's#(.*)/.*$#\1#p' /etc
[root@centos7 data] #echo /etc/fstab | sed -nr 's#.*/([^/]+)/?$#\1#p'
fstab
16 、利用 sed 取出 ifconfig 命令中本机的 IPv4 地址
[root@172 ~] # ifconfig |sed -nr '/inet / s/.*et (.*) ne.*/\1/ p'
17 、统计 centos 安装光盘中 Package 目录下的所有 rpm 文件的以 . 分隔倒数第二个字段的重复次
[root@172 ~] # ls /mnt/BaseOS/Packages/ |sed -nr 's/.*el8\.(.*)\.rpm/\1/
p'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值