shell四大天王之 sed 学习反思

三剑客之 sed 学习笔记

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等.以下介绍的是Gnu版本的Sed 3.02.

它被设计在下列三种情况下发挥作用:

1) 编辑那些对舒适的交互式编辑而言太大的文件.

2) 在编辑命令太复杂而难于在交互模式下键入的时候编辑任何大小的文件.

3) 要在对输入的一趟扫描中有效的进行多个‘全局’(global)编辑函数。

因为每次只把输入的某些行驻留在内存中,并且不使用临时文件,所以可编辑的文件的有效大小,只受限于输入和输出要同时共存于次级存储的要求。相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。

基本正则表

 

扩展正则表

 

 

 

在支持的情况下优先使用扩展正则

sed 
用法1: sed [参数]   '[行号]/[正则匹配]/[指令]' [目的文件]   (一般用于查找或删除文本)
用法2: sed [参数]   's/old/new/(g|[1-n])'   [目的文件] (用于替换特定文本)
用法3: sed [参数]   '[行号][指令] [文本]'     [目的文件] (用于修改查看替换某一行)
参数:
-n 取消自动打印模式空间(输出时屏蔽干扰信息)
-r   在脚本中使用扩展正则表达式
-i 写入修改(练习时不使用)
...
--help   display this help and exit
 
指令:
p       输出文本 (和-n参数连用)
d 删除文本  
i 在目标行之前插入一行文本
a 在目标行之后插入一行文本
c 替换目标行文本

基础操作

指令:p 输出文档内容(一般会-n)

sed -n '1p' user    //输出第1行
sed -n '2,4p' user //输出2~4行
sed -n '3p;5p' user     //输出3行和5行
sed -n '2,+2p' user   //输出第2行,以及后面2行
sed -n '1~2p' user //查看奇数行
sed -n '2~2p' user //查看偶数行

sed的定址符可以使用正则表达式, 在 / / 中间填写

sed -n '/root/p'  user   //查看有root的行
sed -n '/^root/p' user   //查看以root开头的行
sed -n '=' user   //看所有行的行号
sed -n '$=' user   //看最后一行的行号

指令:d 删除行,使用方式和指令p基本一致,注意无需加 -n选项

sed '1d' user    //删除第1行

s 替换

s/old/new/
s///

sed 's/2017/XXXX/' test     //替换文档中所有行的第1个2017
sed '2s/2017/XXXX/' test   //替换第2行的第1个2017
sed '2s/2017/XXXX/2' test   //替换第2行的第2个2017

sed '3s/2017/XXXX/3;3s/2017/XXXX/2' test //替换第3行的第三个2017, 再替换第3行的第2个2017

sed 's/2017/XXXX/g' test   //替换所有2017
sed 's/2017//' test   //将所有行的第1个2017替换为空,等于删除
sed -n 's/root//p' /etc/passwd   //替换passwd文件中所有行的第一个root为空,并显示替换的行

尝试使用sed替换功能将 /bin/bash 替换为 /sbin/sh

sed 's//bin/bash//sbin/sh/' user    //常规方式更换,报错
sed 's/\/bin\/bash/\/sbin\/sh/' user   //使用转义符号屏蔽冲突的斜杠, 可以成功,但麻烦
sed 's!/bin/bash!/sbin/sh!' user //更改替换符号为!
sed 's(/bin/bash(/sbin/sh(' user //或用(

高级操作(运用 ' () ')

[root@Proxy ~]#cat test.txt
Ni Hao Shijie
Hello Changsha

一. 练习

删除每行第二个和最后一个字符

sed 's/.//2;s/.$//' test.txt

二. 练习

将每行第一个字符和最后一个字符互换

sed -r 's/(^.)(.*)(.$)/\3\2\1/'  test.txt 

三,练习

给文档中的所有大写字母加 ' () '

sed -r 's/([A-Z])/(\1)/g' test.txt

四,练习

删除文档中的所有小写字母

sed -r 's/([a-z])//g' test.txt 

五,练习

本案例要求编写脚本getupwd.sh,实现以下需求:

  • 找到使用bash作登录Shell的本地用户

  • 列出这些用户的shadow密码记录

  • 按每行“用户名 --> 密码记录”保存到getupwd.log,如下图所示

#!/bin/bash
#the shell_script is used to take out username and its passwd
user=`sed -n '/bash$/s/:.*//p' /etc/passwd`
rm -f getupwd.log
for u in $user; do
p=`grep $u /etc/shadow | awk -F: '{print $2}'`
echo $u"-->"$p
echo $u"-->"$p >> getupwd.log
done




以上是 shell四大天王之 sed 学习反思 的全部内容, 来源链接: utcz.com/a/46828.html

回到顶部