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: 逆序显示文件内容
参考: