文本处理 sed

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

选项说明:

  • -i[SUFFIX], --in-place[=SUFFIX] 以脚本处理并写入文件
  • -e script, --expression=script 以脚本处理后输出
  • -f script-file, --file=script-file 以脚本文件内容操作文件
  • -n, --quiet, --silent 只输出匹配到的行
  • --help 帮助
  • --version 版本

动作说明:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

示例

原始文件

$ cat > a <<EOF
> 1
> 2
> 3
> 4
> 5
> EOF
$ cat a
1
2
3
4
5

列出文件内容

仅列出目标文件2-3行内容

$ sed -n '2,3p' a
2
3

仅输出

使用 -e 选项 仅输出修改后的内容, 不改变文件内容本身

$ sed -e '4a\newLine' a
1
2
3
4
newLine
5
$ cat a
1
2
3
4
5

注意

sed 后面接的动作,请务必以 '' 两个单引号括住喔

修改内容

通过 -i 选项可以直接对文件进行修改

在第4行下面添加新行

sed -i '4a\newLine' a
$ cat a
1
2
3
4
newLine
5

或者

sed -i '4a newLine' a

如果是在某行前面添加新行:

sed -i '2i newLine' a

在文件末尾添加新行:

sed -i '$a lastline' a

其中 $ 代表最后一行

添加多行

每一行末尾都可以使用 \ 来连接新行

$ nl a | sed '2a newLine1 ......\
> newLine2'
     1	1
     2	2
newLine1 ......
newLine2
     3	3
     4	4
     5	5

以脚本文件内容编辑文件内容

使用 -f 选项可以使用某个文件的内容对目标文件进行处理

新建一个文件 b 并输入 4a\newLine

sed -i -f b a

效果跟执行 sed -i 4a\newLine a 一样

删除文件内容

$ nl a | sed '2,3d'
     1	1
     4	4
     5	5

sed 的动作为 '2,3d' ,那个 d 就是删除!因为 2-3 行给他删除了,所以显示的数据就没有 2-3 行

注意

原本应该是要下达 sed -e 才对,没有 -e 也行

类似的操作:

# 只删除第 2 行
sed '2d' a
# 删除第 3 到最后一行
sed '3,$d' a

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

替换文件内容

将2-3行内容替换为指定内容:

$ sed '2,3c No 2-3 number' a
1
No 2-3 number
4
5

搜索内容

数据的搜寻并显示

搜索 /etc/passwd 中包含字符串 root 的行

$ nl /etc/passwd | sed -n '/root/p'
     1	root:x:0:0:root:/root:/bin/bash
    10	operator:x:11:0:operator:/root:/sbin/nologin
    23	dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

使用 p 进行打印内容, 前面是要是搜索内容的正则表达式

数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

$ nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'
1  root:x:0:0:root:/root:/bin/blueshell

数据的搜寻并删除

删除/etc/passwd所有包含root的行,其他行输出

nl /etc/passwd | sed  '/root/d'

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!

sed 's/要被取代的字串/新的字串/g'

先观察原始信息,利用 /sbin/ifconfig 查询 IP

$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部分,亦即:Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

参考资料

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress