Sed 命令

Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。

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

参考了

①② ③④⑤⑥⑦⑧⑨⑨

1. 语法说明

sed [-hnV][-e<script>][-f<script文件>][文本文件]

1.1 参数说明

  • -e
  • -f<script 文件>或--file=<script 文件> 以选项中指定的 script 文件来处理输入的文本文件。
  • -h 或--help 显示帮助。
  • -n 或--quiet 或--silent 仅显示 script 处理后的结果。
  • -V 或--version 显示版本信息。

1.2 常用动作

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

1.3 不常用的

下面之列出了可以参考的,还有很多,可以参考官方文档

printf '%s\n' aaa bbb ccc | sed =
# 执行文件
seq 3 | sed '2r/etc/hostname'

2. 语法详解

2.1 准备数据

建立一个数据文件,用来作实验.

mkdir test
cd test
touch testfile
vim testfile

输入下面的内容

line1 HELLO LINUX!
line2 Linux is a free unix-type opterating system.
line3 This is a linux testfile!
line4 Linux test

2.2 单行操作

使用下面命令进行:

  • a 新增
  • i 插入
  • d 删除
  • c 替换
  • p 打印,一般要与-n 一起使用
# 第三行后面输出aaa bbb
sed 3a'new Line' ./testfile
# 功能同上
sed -e 3a'aaa bbb' ./testfile
# 在第三行前面添加
sed 3i'new Line' ./testfile
# 替换第三行
sed 3c'new Line' ./testfile
# 删除第三行
sed 3d ./testfile
# 只输出第三行
sed -n 3p ./testfile
# 每行都后面输出
sed a'aaa bbb' ./testfile

下面是输出的例子

line1 HELLO LINUX!
line2 Linux is a free unix-type opterating system.
line3 This is a linux testfile!
new Line
line4 Linux test

如果要添加换行,可以使用\n

2.3 多行操作

具体用法如下:

  • 使用2,5表示开始与结束行号
  • '3,$' 表示从 3 到最后一行,请注意这里必须要添加引号。
  • nl ./testfile 这个命令会给输出的内容添加一个行号。
# 第二与三行后面输出aaa bbb
sed 2,3a'new Line' ./testfile
# 在第二与三行前面添加
sed 2,3i'new Line' ./testfile
# 替换第二第三行,只会替换出一行
sed 2,3c'new Line' ./testfile
# 删除第二第三行
sed 2,3d ./testfile
# 只输出第二第三行
sed -n 2,3p ./testfile
# 只输出第二行到最后一行
sed -n '2,$p' ./testfile

2.4 搜索

/要搜索的内容/ ,通过斜杠来表示要搜索的内容

  • /test/p 表示输出,可以加上-n
  • 后面可以添加:i a d c p 等操作内容。
# 查找包含test的行,并输出。
sed -n /test/p ./testfile
# 在第二与三行前面添加
sed /test/i'aaa bbb' ./testfile
# 在第二与三行后面添加
sed /test/a'aaa bbb' ./testfile
# 替换找到的行
sed /test/c'find line' ./testfile
# 删除的行
sed /test/d ./testfile

2.5 替换

①② ③

① 全局替换

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

下面是一些例子

# 将test替换成--
sed s/test/--/g ./testfile

② 取中间值

下面做一个替换IP地址的例子。这里使用到一个正则表达式:.* 表示左右的,这里一定要加上逗号。

echo 'inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0'>ip
# 删除ip地址前的内容:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
more ip | grep 'inet addr' | sed s/^.*addr://g
# 删除addr后的内容:192.168.1.100
more ip | grep 'inet addr' | sed s/^.*addr://g | sed s/Bcast.*$//g'

2.6 模糊搜索

模糊查询会用到正则表达式

# 查询包含2或者4的行
sed -n '/[2,4]/p' ./testfile
# 查找有空格并且后面跟着i或者p
sed -n '/ [i,t]/p' ./testfile

2.7 写入文件

-i 添加这个文件就是替换文件中的内容,但是要慎用。

准备数据

touch writefile
vim writefile

数据内容如下

runoob.
google.
taobao.
facebook.
zhihu-
weibo-

进行操作

# 不写入文件
sed 's/\!$/\./g' ./writefile
# 加引号与不加引号有很多区别
sed -i 's/\!$/\./g' ./writefile
cat ./writefile
sed '$anewline' ./writefile
# 在最后追加一行
sed -i '$a---newline' ./writefile
# 删除最后一行
sed -i '$d' ./writefile

2.8 高级用法

① 连续编辑

② 循环

③ 多命令

$ seq 6 | sed '1d
3d
5d'
2
4
6
$ seq 6 | sed -e 1d -e 3d -e 5d
2
4
6
$ seq 4 | sed '{1d;3d}'
2
4
$ seq 6 | sed '{1d;3d};5d'
2
4
6

3. 案例说明

3.1 合并行

$ sed '2{N;s/\n//;}' ./testfile
line1 HELLO LINUX!
line2 Linux is a free unix-type opterating system. line3 This is a linux testfile!
line4 Linux test

另外一个例子

$ cat 1.txt
this \
is \
a \
long \
line
and another \
line
$ sed -e ':x /\\$/ { N; s/\\\n//g ; bx }' 1.txt
this is a long line
and another line