sed

流编辑器,以行为单位

常用选项

-n:不打印没关系的行,不输出模式空间的内容至屏幕。
-e:多点编辑,连接多个命令同时处理。也
-f:指定脚本文件,并将脚本应用到文件。脚本文件的内容,每行一个命令。
-r:支持使用扩展正则表达式
-i:edit files in place (makes backup if SUFFIX supplied)
cat > sed.rules << EOF
s/this/THAT/g
/^$/d
EOF

sed -f sed.rules sed.text 
sed –i.bak 's/dog/cat/g' pets

地址定界

1、如果不给地址,对全文进行处理

2、单地址

#: 指定第几行;
/PATTERN/: 被此模式匹配到的每一行

3、地址范围

#,#: 第几行到第几行
#,+#: 第几行到+#行
#,/PAT1/: 第几行到第一次匹配到PAT1的行
/PAT1/,/PAT2/: 第一次匹配到PAT1的行到第一次匹配到PAT2的行
$: 最后一行

4、步进 ~

1~2: 所有奇数行
2~2: 所有偶数行

编辑指令

d:删除

sed '1,5d' /etc/fstab  # 删除 1-5 行

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

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

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

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

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

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

c \text:把匹配到的行替换为此处指定的文本"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'
  
替换标记 flag:
  g: 全局替换;
  p: 显示替换成功的行;
  w: 将替换成功的结果保存至指定文件中; 

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

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

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、在/root/install.log每一行行首增加#号;

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

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

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

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

egrep -o "[[:alpha:]]+" /etc/init.d/functions | sort | uniq -c | sort -n 
sed 's@[^[:alpha:]]@\n@g' /etc/init.d/functions | sort | uniq -c | sort -n 

高级命令

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' /etc/fstab: 删除原有的所有空白行,而后为所有的非空白行后添加一个空白行
sed 'n;d' file: 显示奇数行
sed 'G' file: 在原有的每行后方添加一个空白行
sed -n '1!G;h;$p' file: 逆序显示文件内容

参考:

posted @ 2017-05-07 07:38  KeithTt  阅读(263)  评论(0编辑  收藏  举报