示例 4:使用“-i”选项编辑源文件
为了我们的安全,sed 命令默认不编辑原始文件或者源文件,但可以通过使用“-i”选项来编辑源文件。
# sed -i '1d' /tmp/passwd
以上命令将删除源文件/tmp/passwd 的第一行。
示例 6:通过指定范围删除行。
删除 /tmp/passwd 文件的前 5 行。
# cat /tmp/passwd | sed '1,5d'
示例 9:搜索和替换文件中的字符串
假设我们想用 'Admin' 替换 'root',示例如下所示:
# sed 's/root/Admin/' /tmp/passwd
需要注意的是 sed 只替换一行中的第一次出现,这一点非常重要。
如果字符串 'root' 在一行中出现多次,则只会替换第一个匹配项。
要将文件中的每个字符串替换为新的字符串而不是第一个出现的字符串,要进行全局替换,请在命令末尾添加一个字母“g”,如下所示:
# sed 's/root/Admin/g' /tmp/passwd
示例 5:在编辑之前备份源文件
当我们在 sed 命令中使用“-i”选项时,它会变得非常危险,因为它会直接编辑源文件,所以最好在编辑前备份源文件,示例如下所示。
# sed -i.bak '1d' /tmp/passwd
# ls -l /tmp/passwd* -rw-r--r-- 1 root root 2229 Nov 24 22:36 /tmp/passwd -rw-r--r-- 1 root root 2261 Nov 24 22:35 /tmp/passwd.bak
在上面的 sed 命令中,文件 /tmp/passwd 的第一行将被删除,但在此之前 sed 命令会将 /tmp/passwd 的备份作为 /tmp/passwd.bak。
示例 8:删除包含字符串的行
假设我们要从文件 /tmp/passwd 中删除包含“games”一词的行。
# sed '/games/d' /tmp/passwd
Sed 是类 UNIX 操作系统中的流编辑器(Stream Editor),用于过滤和转换文本。
Sed 最初是从基本的行编辑器 'ed' 派生出来的,这是一种我们可以在每个 Unix 系统上找到的编辑器,但由于其复杂的用户界面而很少使用。
示例 10:使用 -e 选项的多重替换
假设我们想用 'Admin' 替换 'root' 字符串,用 'sh' 替换 'bash' 字符串。
示例如下所示:
# cat /tmp/passwd | sed -e 's/root/Admin/g' -e 's/bash/sh/g'
sed 如何工作?
由于 sed 是一个流编辑器,它处理从 stdin 接收的数据流,例如通过管道,将其结果作为数据流写入 stdout(通常是桌面屏幕)。
我们可以将此输出重定向到一个文件。
Sed 通常不会修改原始输入文件;相反,我们可以通过管道发送我们文件的内容以供 sed 处理。
这意味着我们不需要在磁盘上有一个包含我们要更改的数据的文件,如果数据来自另一个进程而不是已经写入文件中,这将特别有用。
sed 的语法
# sed [option] commands [input-file]
在这篇文章中我们将讨论sed命令的一些实际例子,我们将对文件“passwd”进行很多sed操作,因此首先将文件“/etc/passwd”复制到/tmp文件夹中。
# cp /etc/passwd /tmp/
示例 2:使用“-e”选项调用 sed(将脚本添加到要执行的命令中)
我们可以指示 sed 从文件中读取数据,而不是通过管道向其发送文件来调用 sed,如下例所示。
# sed -e 'd' /tmp/passwd #
以这种方式调用 sed 将编辑命令显式定义为要在输入文件 /tmp/passwd 上执行的 sed 脚本。
这里的脚本只是一个单字符的编辑命令,但它可以更大。
我们还可以将 sed 命令的标准输出重定向到一个文件中。
# sed -e 'd' /tmp/passwd > /tmp/new-passwd
示例 3:使用 sed 打印行(-n 标志和 p 命令)
'-n' 标志禁用自动打印,以便 sed 仅在使用 'p' 命令明确指示时才打印行。
# cat /tmp/passwd | sed 'p' | head -5 root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
正如我们在上面看到的,如果我们指定没有 '-n' 标志的 'p' 编辑命令,sed 将打印重复的行。
因此,要显示唯一的行,请在 sed 中使用带有 p 命令的“-n”标志。
示例如下所示:
# cat /tmp/passwd | sed -n 'p' | head -5 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync
示例 1:使用 sed 删除所有行
# cat /tmp/passwd | sed 'd'
上述命令通过管道将文件 /tmp/passwd 的全部内容发送到 sed。
请记住,文件 /tmp/passwd 根本没有改变。
sed 只读取文件的内容,我们没有告诉它写入文件,只读取它。
每行编辑命令的结果打印到标准输出。
在这种情况下,屏幕上没有打印任何内容,因为我们使用了选项“d”来删除每一行。
示例 7:删除文件的空行
# cat /tmp/detail.txt 245 678 linux unix suse
在 details.txt 文件中我们有两个空行,使用下面的命令删除空行。
# sed '/^$/d' /tmp/detail.txt 245 678 linux unix suse