Linux学习总结(二十)正则三剑客之sed

sed
流式编辑器,针对文档的行来操作的

一 查找打印

1.打印某行
格式: sed -n ‘n‘p filename 单引号内的n代表数字,表示第几行
例如:打印第二行
sed -n ‘2‘p /etc/passwd
也可以指定区间,比如打印前三行
sed -n‘1,3‘p /etc/passwd
打印所有的行
sed -n ‘1,$‘p /etc/passwd

  1. 打印包含某个字符串的行,相当于grep
    格式 : sed -n ‘/字符串/‘p filename
    例如 sed -n ‘/root/‘p /etc/passwd
    -e 可以实现在一条命令中对文档进行多次操作,意思是针对某个文档并行操作几次,两个-e,就是两次操作,依次类推。例如:
    sed -e ‘1,3‘p -e ‘/root/‘p -n /etc/passwd
    该命令等价于 sed -n ‘1,3‘p /etc/passwd;sed -n ‘/root/‘p /etc/passwd
  2. 我们刚学过grep 有个-i 选项,可以忽略大小写匹配,sed 同样可以,加一个I选项。例如
    sed -n ‘/root/‘Ip /etc/passwd

    二 删除

    1.删除指定的行,直接举例
    sed ‘1,3‘d /etc/passwd 删除前三行,剩余的行会在屏幕打印
    2.删除根据字符串查找出的行
    sed ‘/root/‘d /etc/passwd 删除带有root的行,显示剩余的行
    3.-i 选项可以直接操作源文件。那么我们拷贝一份/etc/passwd再操作
    cp /ect/passwd ./test.txtt
    sed -i ‘1,3‘d test.txt

    三 查找替换

    格式为: sed ‘1,n s/new/old/g‘ filename
    1,n n为数字,指定要替换的区域
    s 替换标识符
    new 用来替换的字符串
    old 将被替换的字符串
    g 标示全局替换
    1.将上面的test.txt文件,前10行中的root全部替换为boot
    sed ‘1,10 s/root/boot/g‘ test.txt 对于该需求我们还可以用正则,例如
    sed ‘1,10 s/ro+t/boot/g‘ test.txt -r 我们发现我们多用了一个-r,原因是
    sed无法直接识别+,它的作用类似于我们grep用的-E选项,当然我们也可以用转意符

    2.将test.txt中以:号分割的第一段和最后一段交换位置
    该问题的重点是我们怎么用正则表达要交换的字符串,标示出的字符串要怎么交换,既让目标位置交换,又不破坏其他字符。我们给出思路和结果
    以:号分割,我们将一行看作三段。
    字符串1:字符串2:字符串3
    字符串1和字符串2,我们可以非冒号字符匹配整个字符串,([^:]+)
    字符串2,我们不对其操作,直接贪婪匹配 (.*)
    那么最后的结果为:

sed ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/g‘ test.txt -r
我们打印前三行看下结果:

3.把test.txt中英文字母全删除。
也就是把英文字母全部找出来替换为空。
sed ‘s/[a-zA-Z]//g‘ test.txt,我贴出部分结果

4.在test.txt 文件中行首都加上#:字符
分析: 我们同样用替换的办法,被替换对象就是整行内容,我们用贪婪匹配 (.*) 用来替换的部分就是给原来字符行首加上#: 原来字符可以用&标示,也可以用\1标示,因为只有一段就是第一段,结果为:

sed ‘s/(.*)/#:&/g‘ test.txt -r 或者 sed ‘s/(.*)/#:\1/g‘ test.txt -r

5.删除test.txt 中的所有特殊字符
解读:特殊字符就是非数字非英文字母

sed ‘s/[^0-9a-zA-Z]//g‘ test.txt

6.把test.txt中出现的第一个单词和最后一个单词调换位置
分析:很显然分为三段处理,第一个单词,我们用字母开头一直匹配完就可以 (^[a-zA-Z]+)
中间一段从非字母开头一直匹配到非字母结束,中间匹配任意字符 ([^a-zA-Z].*[^a-zA-Z])
最后一个单词用字母匹配至末尾就可以 ([a-zA-Z]+$)
最后的结果为:

sed ‘s/(^[a-zA-Z]+)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]+$)/\3\2\1/g‘ test.txt -r

7把test.txt中的第一个数字移动到本行末尾
分析:也是分为三段,第一段非数字开头匹配 (^[^0-9]+), 第二段匹配数字([0-9]+)
第三段非数字开头,后面匹配任意到结尾([^0-9].*$),第二段和第三段交换位置就可以了。结果为:

sed ‘s/(^[^0-9]+)([0-9]+)([^0-9].*$)/\1\3\2/g‘ test.txt -r

原文地址:http://blog.51cto.com/12606610/2083379

时间: 2024-11-09 02:20:31

Linux学习总结(二十)正则三剑客之sed的相关文章

Linux学习笔记<二十五>——openssh服务

ssh:Secure SHell ssh特点: 基于TCP22号端口: 密文认证: 密文传输数据 openssh是ssh的开源实现,支持ssh v1和ssh v2 但ssh v1无法解决中间层攻击,建议不要使用 客户端: Linux:ssh Windows:putty,SecureCRT,SSHSecureShellClient,Xmanager 服务器端: Linux:sshd openssh相关命令 1.ssh -X:enable X11 forwarding -Y:enable trust

Linux学习笔记<二十六>——DNS服务器

DNS(Domain Name System 域名系统):提供Internet上域名到IP地址的映射 域名:又叫主机名,FQDN(Full Qualified Domain Name完全限定域名) 基本信息: Linux中通常使用bind服务来提供DNS服务器 应用层协议 基于UDP53端口号:用于查询 基于TCP53端口号:用于主从服务器同步数据 基于TCP953端口号:rndc用于远程控制DNS服务器 解析方式: 正向:FQDN <--> IP 反向:IP <-->FQDN 解

Linux学习(二十二)Shell基础(二)变量、环境变量配置文件

一.变量 变量是一个容器,里面能放不同的值. 要点知识: PATH,HOME,PWD,LOGNAME这些都是变量. 例子: [[email protected] ~]# echo a+b a+b [[email protected] ~]# echo $a+$b 3+4 [[email protected] ~]# echo $a3$bc [[email protected] ~]# echo $a3$b 4 [[email protected] ~]# echo $a"3"$b 33

Linux学习(二十二)Shell基础(三)特殊符号、sort、wc、uniq、tee、tr、split

一.特殊符号 * :任意个任意字符 [[email protected] ~]# ls 1* 1bak.zip 1.tar 1.zip.bz2 1: 1.txt 2 [[email protected] ~]# ls 1*2 ?:一个任意字符 [[email protected] ~]# ls 2?tar 2.tar #:注释 [[email protected] ~]# #ls [[email protected] ~]# \:脱意 [[email protected] ~]# a=3 [[e

Linux学习(二十九)iptables(三)nat表的应用

需求 A机器可以访问外网,B机器和A机器处于同一个内网,现在要让B机器通过A机器访问外网. 步骤 1.为虚拟机添加一块网卡. 如果没有区段名称的话,点击'LAN区段(S)...'按钮,新建一个. 2.ifconfig -a命令可以看到刚添加进来的尚未启用的网卡: [[email protected] ~]# ifconfig -a eth1 Link encap:Ethernet HWaddr 00:0C:29:AC:CC:56 inet addr:192.168.182.130 Bcast:1

Linux学习笔记&lt;二十九&gt;——http服务

基础概念: HTTP:Hyper Text Transfer Protocol 超文本传输协议 versions: HTTP/0.9:只接收GET一种请求方法,只支持纯文本 HTTP/1.0:支持PUT.POST.DELETE和HEAD,支持MINE HTTP/1.1:在HTTP/1.0的基础上,增加了缓存功能,支持长连接,支持管道方式同时                  发送多个请求 HTTP请求方法:获取资源的方法 HTTP/0.9:GET HTTP/1.0:PUT(修改服务器上的内容),

Linux学习笔记&lt;二十&gt;——系统裁剪之二

在系统裁剪之一的基础上,给系统添加挂载文件系统.关机重启.设置主机名.运行对应级别的服务脚本.启动终端.装载网卡驱动并启用网络等功能. 挂载文件系统 ①重新挂载根文件系统为可读写 vim 编辑/mnt/sysroot/etc/rc.d/rc.sysinit添加以下行 echo "Remount rootfs..." mount -n -o remount,rw / ②vim 编辑/mnt/etc/fstab /dev/sdb2       /       ext3    default

Linux学习笔记&lt;二十五&gt;——openssl服务

openssl服务:SSL的开源实现,官方站点 www.openssl.org 组成: libcrypto:通用加密库 libssl:TLS/SSL的实现库 基于会话的,实现了身份认证,数据机密性和会话完整性的TLS/SSL库 openssl:多用途命令工具 可以实现私有证书颁发机构 openssl常用子命令: openssl version:查看openssl的版本 [[email protected] named]# openssl version OpenSSL 0.9.8e-fips-r

Linux学习笔记&lt;二十二&gt;——计划任务

计划任务 1.在未来的某个时间点执行某一次任务: batch:不需要指定时间,自动在系统空闲时间执行 at at 时间 at>COMMAND at>... at>Ctrl+d 指定时间 绝对时间: HH:MM, DD.MM.YY MM/DD/YY 相对时间:now+# 单位:minutes,hours,days,weeks 模糊时间:noon,midnight,teatime(下午4:00) 命令的执行结果,将以邮件的形式发送给安排任务的用户 at -l = atq:显示job [[em

Linux学习笔记&lt;二十四&gt;——sudo

sudo:某个用户能够以另外一个用户的身份通过哪些主机执行什么命令 sudo COMMAND -l:列出当前用户可以使用的所有sudo类命令 -k:让认证信息失效,即每次执行都需要认证 sudo的配置文件/etc/sudoers 一行定义一个sudo条目: who whitch_hosts=(runas) TAG:command 支持的alias,可使用!取反 who:User_Alias which_hosts:Host_Alias runas:Runas_Alias command:Cmnd