您的位置:首页 > 运维架构 > Linux

Linux文本三剑客之sed仗剑走天涯

2016-03-20 18:19 239 查看
一,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个。





①^.*am–>这句的意思是以任意字符开头到am为止,匹配文件中的I am字符串;
②\([a-z].*\)–>这句的外壳就是括号\(\),[a-z].*合起来就是匹配任意多个字符,因为ood字符串是我们需要的,因此用括号括起来匹配,后面通过\1来取good字符串;
③ b.*$–>表示以空格b起始,任意字符结尾,实际就是匹配good字符串后,紧接着的字符串 boy.;
④sed默认识别基本正则表达式,sed加上-r选项则可以使用扩展正则表达式。


3.特殊符号 & 代表被替换的内容
将text9前三行中 b 改成 --b--
~]# sed '1,3s#b#--&--#g' text9




4.打印奇偶行
打印奇数行:
~]# sed -n '1~2p' text9
~]# sed -n 'p;n' text9



打印偶数行:
~]# sed -n 'n;p' text9
~]# sed -n '2~2p' text9




5.获取本机IP地址
~]# ifconfig | sed -n '2p' | sed 's/^.*inet//g' | sed 's/netmask.*$//g'




6.将text9中偶数行末尾替换成 --w ;
sed '2~2s#$#--w#' text9
sed 'n;s#$#--w#' text9
sed '1~2!s#$#--w#' text9




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: