Shell脚本利器之——sed流编辑器

Linux的一个核心思想是:一切皆文件。而在这些文件中,文本文件占据重要地位,所有系统设置的改变,软件参数的调整,以及最基本的命令行操作,都是对“文本”的操作。要操作文本,肯定离不开文本编辑器。

在Linux系统中,文本编辑器分为两类,一类是全屏编辑器,如:vi,vim,nano等等,打开一个文本文件,在全屏模式下完成对文本的修改和保存等操作;另一类是流编辑器,如:sed,grep,awk等等,不直接打开文件,在命令行下,通过一串命令完成对文本的操作,包括查找、插入、替换、删除、追加等等。

sed就是一款出色的流编辑器,它以行为单位处理文本,它的一般处理流程是这样的:首先读取待处理文件的第一行到缓冲区(内存里的一块区域),然后按照给出的命令对该行进行操作,这些操作包括查找、替换、删除等等,操作完成后,从缓冲区输出到屏幕进行显示,完成一个循环。之后,再读取第二行文本到缓冲区,开始第二个循环。如此循环,直到处理完所有行为止。此时屏幕显示的内容来自缓冲区,并没有改写原文件。上面提到的缓冲区,学名叫:模式空间。如果需要把修改后的内容保存下来,有两种方式,一是使用-i参数,直接修改原文件;二是使用重定向,把修改后的文本保存在另一个文件中。

虽然sed支持的对文本的操作功能很多,但是最常用的是替换功能,所以本文主要介绍替换功能的使用,更多功能和用法还请参照使用手册。

sed工具的命令格式为:

sed 选项 子命令	文件1,文件2,文件3……

常用选项:

-e		在命令行模式下进行sed动作编辑。默认值
-f		从文件中读取需要执行的sed动作。
-i		不经过缓冲区,直接修改原文件里的内容。
-n		只打印匹配到的,或者经过后续的指令处理过的行。
-r		增加支持扩展表达式

常用子命令:
s/目标文本/新文本/ 在每一行中,把匹配到的第一个【目标文本】替换为【新文本】
s/目标文本/新文本/g 在每一行中,把匹配到的所有【目标文本】替换为【新文本】
s/目标文本/新文本/Ng 在每一行中,把匹配到的第N个及之后的所有【目标文本】替换为【新文本】
s/目标文本/新文本/N 在每一行中,把匹配到的第N个【目标文本】替换为【新文本】

文件或文件列表,sed支持一次处理多个文件,两个文件之间需要用英文逗号隔开。

sed应用举例

测试文本如下:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
  1. 替换当前行中匹配到的第1个内容:
$ sed 's/root/admin/' test_file
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
  1. 替换当前行中匹配到的第2个内容:
$ sed 's/root/admin/2' test_file 
root:x:0:0:admin:/root:/bin/bash
  1. 替换当前行中匹配到的所有内容:
$ sed 's/root/admin/g' test_file
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
  1. 替换当前行中匹配到的第2个及以后的所有内容:
sed 's/root/admin/2g' test_file 
root:x:0:0:admin:/admin:/bin/bash

待续……

发布了13 篇原创文章 · 获赞 0 · 访问量 205

猜你喜欢

转载自blog.csdn.net/sinat_28296423/article/details/104028749
今日推荐