sed(stream editor)是一个行编辑器, 以“行”为处理单位,处理后的结果会输出到标准输出。处理时,sed把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。而原文件内容并没有改变,除非使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
1. sed的命令格式:
sed [options] "script" FILE1 ...
"script" 通常由"地址定界/command"或"/pattern/command"组成, /pattern/可以使用正则表达式。
例如:sed -n "/^#/p" /etc/fstab -- 将/etc/fstab中#开头的行显示到屏幕
2. 常用选项[options]:
-n: 静默(silent)模式,即不输出模式空间中的内容,只显示script处理后的结果;
-e: 指定在一个sed命令中使用多个script,格式为-e 'script1' -e 'script2' ...
-i: 直接修改原文件;
-r: 支持使用扩展正则表达式元字符;
-f /path/to/sed_script: 从文件中读取处理脚本,并执行;
3. 地址定界:
/pattern/: 仅匹配被模式到的行;
d: 删除符合条件的行
# sed "2d" a.txt --删除a.txt文件的第二行。 # sed "3,$d" a.txt --删除a.txt文件的第三行到末尾所有行。 # sed "$d" a.txt --删除a.txt文件的最后一行。 # sed "/test/d" a.txt --删除a.txt文件所有包含test的行。
c \text: change, 将符合条件的行替换为指定的文本;
# sed "1c\#!/bin/bash" file1 --把第一行替换成#!/bin/bash
=: 显示匹配到的行的行号;
s: 字符的查找替换,s@要查找的内容@替换为的内容@ , "@"也可以用"/" "#" 代替。
要查找的内容:可以使用模式
替换为的内容:不可以使用模式,但可以引用, &
# sed "s@test@mytest@g" file1 --在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。 # sed -n "s/^test/mytest/p" file1 --(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。 # sed "s/^192.168.0.1/&localhost/" file1 --&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。 # sed -n "s/\(love\)able/\1rs/p" file1 --love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。 # sed "s#10#100#g" file1 --不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。