sed

流编辑器,以行为单位;

# sed --help      
sed [OPTION]... {script-only-if-no-other-script} [file]...    

常用选项:

-n:不打印没关系的行;不输出模式空间的内容至屏幕;
-e:多点编辑;连接多个命令同时处理;也可以用分号";"隔开
-f:指定脚本文件,并将脚本应用到文件;
脚本文件的内容,每行一个命令:

# cat sed.rules
  s/this/THAT/g 
  /^$/d
# sed -f sed.rules sed.text 

-r:支持使用扩展正则表达式;
-i:直接修改原文件;可以用-i.bak参数备份原文件;

# sed –i.bak 's/dog/cat/g' pets

地址定界:

1、不给地址:对全文进行处理;
2、单地址:
    #:指定第几行;
    /PATTERN/:被此模式匹配到的每一行;
3、地址范围:
    #,#:第几行到第几行;
    #,+#:第几行到+#行;
    #,/PAT1/:第几行到第一次匹配到PAT1的行;
    /PAT1/,/PAT2/:第一次匹配到PAT1的行到第一次匹配到PAT2的行;
    $:最后一行;
4、步进:~
    1~2:所有奇数行;
    2~1:所有偶数行;

编辑命令:

d:删除

# sed '1,5d' /etc/fstab

p:打印,必须使用-n参数;

# ifconfig | sed -n '2p'      显示第二行
# sed '1~2p' /etc/fstab       奇数行会显示2次
# sed -n '1~2p' /etc/fstab    只显示奇数行
# sed '1~2d' /etc/fstab       显示偶数行,删除奇数行

i ext:在行前面插入文本"text",支持使用 实现多行插入;

# sed '3 i 
ew line' /etc/fstab      在第三行前面插入new line
# sed '3 i 
ew line
another new line' /etc/fstab

a ext:在行后面追加文本"text",支持使用 实现多行追加;

# sed '3 a 
ew line' /etc/fstab        在第三行后面插入new line
# sed '/UUID/ a 
ew line' /etc/fstab   在包含UUID的行后面插入new line

c ext:把匹配到的行替换为此处指定的文本"text",注意是整行替换;

w:保存匹配到的结果到指定位置;

# sed -n '/^[^#]/p' /etc/fstab
# sed '/^[^#]/w /tmp/fstab.new' /etc/fstab

r:从其它文件读取文本,并插入匹配行之后;文件合并;

# sed '3 r /etc/issue' /etc/fstab

=:为匹配到的行打印行号;

# sed '/^UUID/=' /etc/fstab

!:条件取反;

# sed '/^[^#]/d' /etc/fstab     删除非#开头的行
# sed '/^#/!d' /etc/fstab       删除非#开头的行
# sed '5!d' /etc/fstab          只保留第5行(处理未匹配到的行)

s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;

默认情况只替换第一次匹配到的内容;
  sed 's/line/LINE'
要想每行最多匹配2个,可使用/2 
  sed 's/line/LINE/2'
替换标记:
  g:全局替换;
  p:显示替换成功的行;
  w:将替换成功的结果保存至指定文件中; 

&:引用前面搜索到的整个内容;

查找替换命令为/tmp/functions文件的每个以空白字符开头的行的行首加上#;
:%s@^[[:space:]]@#&@g

():后向引用,引用分组;如s/(love)able/1r,loveable替换成lovers;

示例:

1、删除/etc/prelink.conf.d/grub2.conf文件中所有以空白字符开头的行的行首的空白字符;

# sed 's@^[[:space:]]+@@' /etc/prelink.conf.d/grub2.conf

2、删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;

# sed 's@^#[[:space:]]*@@' /etc/fstab

3、输出一个绝对路径给sed,取出其目录;

# echo "/var/log/messages" | sed 's@[^/]+$@@'
# echo "/var/log/messages" | sed -r 's@[^/]+$@@'

4、在/root/install.log每一行行首增加#号;

# sed 's@^.*@#&@' /root/install.log 
# sed 's@^@#@' /root/install.log

5、在/etc/fstab文件中不以#开头的行的行首增加#号;

# sed '/^#/!s@.*@#&@' /etc/fstab    处理未匹配到的行
# sed '/^#/!s@^@#@' /etc/fstab

6、处理/etc/fstab路径,使用sed命令取出其目录名和基名;

# echo "/etc/fstab" | sed 's@[^/]+$@@'
# echo "/etc/fstab" | sed 's@^.*[/]@@'

7、利用sed取出ifconfig命令中本机的IPv4地址;

# ifconfig | sed -n '2p' | tr -s " " | cut -d" " -f3

8、过滤出/media/cdrom/Packages目录下rpm包的架构字段,并统计每种架构的个数;

# ls *.rpm | sed 's@.*.(.*).rpm@1@' | sort | uniq -c 
# ls *.rpm | sed -r 's@.*.(.*).rpm@1@' | sort | uniq -c 
# ls *.rpm | sed -r 's@.*.(.*)..*@1@' | sort | uniq -c
# ls *.rpm | rev | cut -d. -f2 | rev | sort | uniq -c 
    rev:reverse lines of a file or files.把每一行反序显示;

9、统计一个文件里面哪个单词重复的次数最多;

# egrep -o "[[:alpha:]]+" /etc/init.d/functions | sort | uniq -c | sort -n 
# sed 's@[^[:alpha:]]@
@g' /etc/init.d/functions | sort | uniq -c | sort -n 
原文地址:https://www.cnblogs.com/keithtt/p/6819398.html