sed 命令详解

sed 简介

sed:Stream EDitor,流编辑器,行。

语法:

sed [OPTION]...  'script'  [input-file] ...

script:

地址定界编辑命令

常用选项:

-n:不输出模式空间中的内容至屏幕;
-e script, --expression=script:多点编辑;
-f  /PATH/TO/SED_SCRIPT_FILE
    每行一个编辑命令;
-r, --regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;
	
# sed  -e  's@^#[[:space:]]*@@'   -e  '/^UUID/d'  /etc/fstab

地址定界:

(1) 空地址:对全文进行处理;
(2) 单地址:
    #:指定行;
    /pattern/:被此模式所匹配到的每一行;
(3) 地址范围
    #,#:
    #,+#:
    #,/pat1/
    /pat1/,/pat2/
    $:最后一行;
(4) 步进:~
    1~2:所有奇数行
    2~2:所有偶数行

编辑命令:

d:删除;
p:显示模式空间中的内容;
a  \text:在行后面追加文本“text”,支持使用\n实现多行追加; 
i  \text:在行前面插入文本“text”,支持使用\n实现多行插入; 
c  \text:把匹配到的行替换为此处指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
	地址定界!编辑命令;
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
	替换标记:
	    g:全局替换;
	    w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
	    p:显示替换成功的行;

sed 练习:

练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
# sed  's@^[[:space:]]\+@@' /etc/grub2.cfg

练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
# sed  's@^#[[:space:]]*@@'  /etc/fstab

练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'

高级编辑命令:

h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
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:删除文本中空行和空格组成的行及#号注释的行 
# grep -Eiv "^#|^$" /etc/ssh/ssh_config 
Host *
        GSSAPIAuthentication yes
        ForwardX11Trusted yes
        SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
        SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
        SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
        SendEnv XMODIFIERS
案例2:在实际生产中,在修改配置文件的时候,有一些空格、空行、带“ #”开头的注释都要删除或替换
# cat test.txt 
  today is nice day
  you can walk out on the street
  it will be import to you
    hehe

# sed 's/^[ ]*//' test.txt 
today is nice day
you can walk out on the street
it will be import to you
hehe

# sed 's/[[:space:]]*//' test.txt  
today is nice day
you can walk out on the street
it will be import to you
hehe

# sed 's/[[:space:]]\+//' test.txt  
today is nice day
you can walk out on the street
it will be import to you
hehe
案例3:从 Google 上下载下来的配置文件往往都带有数字,现在需要删除所有行的首数字
# cat test.txt 
1today is nice day
2you can walk out on the street
3it will be import to you

# sed 's/^[0-9][0-9]*//g' test.txt 
today is nice day
you can walk out on the street
it will be import to you

 

posted @ 2019-03-12 10:00  miclesvic  阅读(406)  评论(0)    收藏  举报