一,sed是什么?
sed是Strem Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。对文件内容逐行(行编辑器,一行读取一次,对行编辑)进行处理调用操作并显示到STDOUT,常用功能有增删改查,过滤,取行。
二,sed的工作流程
(1)sed默认不编辑原文件,而是逐行操作处理,把当前处理的行存储在临时缓存空间,称为“模式空间”(pattern space)。
(2)接着在pattern space内进行模式匹配,即和指定条件做匹配
不满足模式:输出到标准输出STDOUT;
满足模式:进行指定的模式操作,再输出到STDOUT;
(3)第二个特殊的缓存空间――“保持空间”:hold space,临时保存操作在另一处缓存空间;
(4)当执行pattern space和 hold space里相关选项的时候来回进行之间的数据流编辑操作;
(5)最后根据操作执行hold space空间操作,选择性显示到STDOUT;
三,sed的语法格式
sed [OPTION]... 'script' [input-file] ...
注意:1.sed和后面的选项之间至少有一个空格。
2.script:指的是AddressCommands(地址定界编辑命令),AddressCommands中间无空格,直接连接为一个选项操作
3.input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。
四,sed的常用选项和地址定界
(1)OPTION常用选项:
-n:不输出模式空间中的内容至屏幕; -e script, --expression=script:多点编辑; -f /PATH/TO/SED_SCRIPT_FILE:每行一个编辑命令; -r, --regexp-extended:支持使用扩展正则表达式; -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;(编辑操作的结果直接保存在原文件中)
(2)地址定界:
①空地址:什么都不写时,表示对全文进行处理;
②单地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;注意:【/ /】是固定模式符号,不能省略
③地址范围:(#表示任意数字)
#,#:从某行到某行,第二个#大于第一个#
#,+#:从某行开始到加多少行(3,+8 :第3行向下开始一共8行,包含第三行)
#,/pattern1/:(从指定的行开始到第一次被模式所匹配的行结束的所有行)
/pattern1/,/pattern2/:从第一次匹配到的模式1到第二次匹配到的模式2
$:最后一行;
④步进:~,#~# 从第几行
1~2:所有奇数行。 从第一行开始,每次加两行读取
2~2:所有偶数行。 从第二行开始,每次加两行读取
五,sed编辑命令
(1)常用编辑命令:
d:删除;
~]# sed '1d' FILE #删除第一行 ~]# sed '2,$d' FILE #删除第二行到最后一行
p:列印;显示模式空间中的内容,但默认会输出2次匹配的结果,因此使用-n取消默认输出;
~]# sed -n '1p' FILE #显示第一行 ~]# sed -n '2,$p' FILE #显示第二行到最后一行
a \text:新增;在行后面追加文本“text”,支持使用\n实现多行追加;
~]# sed '/^test/a\this is' FILE #将 this is 追加到以test开头的行后面 ~]# sed '2a\this is\nis this' FILE #将 this is 和 is this 多行追加第二行后面
i \text:插入;在行前面插入文本“text”,支持使用\n实现多行插入;
~]# sed -i '5i\this is' FILE #在文件第5行之前插入this is ~]# sed -i '5i\this is\nis this' FILE #将 this is 和 is this 多行插入第5行之前
c \text:按行替换;把匹配到的行替换为此处指定的文本“text”;
~]# sed '2c\this is' FILE #将文件第二行替换为this is
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
~]# sed -n '/test/w file' example #在example中所有包含test的行都被写入file里
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
~]# sed '2r file' filename #将file的内容读进来显示在filename文件第二行后面
=:为模式匹配到的行打印行号;
~]# sed '/this is/=' FILE #显示 this is 的行号
!:条件取反;
地址定界!编辑命令;
~]# sed '1!d' FILE #除了第一行全部删除
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
~]# sed 's/book/books/' FILE #把每一行中第一处 book 替换成 books
替换标记:
g:全局替换;
~]# sed 's/book/books/g' FILE #把每一行中的所有 book 替换成 books ~]# sed 's/book/books/3g' FILE #从每一行的第三处开始替换
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
~]# sed 's/book/books/3gp' FILE #显示替换成功的行
练习:
1.删除text9文件中所有以空白字符开头的行的行首的所有空白字符;
~]# sed 's@^[[:space:]]\+@@' text9
2.删除text9文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
~]# sed 's@^#[[:space:]]*@@' text9
3.输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@' ~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
(2)高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
P:打印多行匹配空间的第一行。
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
实例:
sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed ’$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后两行;
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的每行后方添加一个空白行
六,实战案例
1.变量替换
2.分组替换\( \)和\1的用法:
\( \)
的功能可以记住正则表达式的一部分,其中,\1
为第一个记住的模式即第一个小括号中的匹配内容,\2
第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。
3.特殊符号 & 代表被替换的内容
将text9中 b 改成 --b--
4.打印奇偶行
打印奇数行:
打印偶数行:
5.获取本机IP地址