sed stream edit 非交互式 对文件做编辑的工具
语法格式
sed [选项] '动作' 文件列表
sed [选项] '条件动作' 文件列表
以行为处理单位 一次处理一行 逐行处理
默认把处理结果输出到屏幕
+++++++++++++++++++++++++++++++++++++++++++++++
选项:
-n #屏蔽默认输出
-i 直接修改文件内容
-f 使用sed脚本
+++++++++++++++++++++++++
vim test.sed
s/haha/xixi
s/[0-9]//g
........
:wq
sed -f test.txt a.txt
+++++++++++++++++++++++++
-e 可指定多个处理动作
-r 启用扩展的正则表达式,若与其他选项一起用应作为首个选项
{} 可组合多个命令,以分号分隔
处理动作:
p打印行
2,4p 输出第234行
2p;4p 输出第2和第4行
d删除行 (删除一行)
2,4d 删除第234行
s 字符串替换
s/old/new 将每行的第一个old替换为new
s/old/new/3 将每行的第3个old替换为new
s/old/new/g 将所有的old替换为new
++++++++++++++++++++++++++++++++++++++++++++
p打印行
sed 'p' a.txt 输出所有行不屏蔽默认输出(出现两遍内容)
sed -n 'p' a.txt 输出所有行 sed -n '3p' a.txt
cat -b a.txt
sed -n '3p' a.txt 输出第三行
sed -n '3,5p' a.txt 输出345行
sed -n '$p' a.txt 输出最后一行
sed -n '1p;5p;$p' a.txt 输出1,5,和最后一行
sed -n '/^r/p' a.txt 输出以r开头的行
sed -n '/h$/p' a.txt 输出以h结尾的行
sed -n '/h/p' a.txt 输出带h的行
sed -n 'p;p;p' a.txt 把每行内容输出3次
sed -n '3,+10p' a.txt 输出第3行及其后10行的内容
sed -n 'p;n' a.txt 输出奇数行,n表示读入下一行文本(隔行)
sed -n 'n;p' a.txt 输出偶数行,n表示读入下一行文本(隔行)
sed -n '$=' a.txt 输出文件的行数
sed -n '10,${n;p}' a.txt 输出第10行到最后一行所有的偶数行
---------------------------------------------------------------------
d删除行 (删除一行) 不带-i不修改原文件
sed '1d' a.txt 删除第一行
sed '$d' a.txt 删除最后一行
sed '1,3d' a.txt 删除第123行
sed '/r/d' a.txt 删除包含r的行
sed '/r/!d' a.txt 删除不包含r的行
sed '/^r/d' a.txt 删除以r开头的行
sed '/^$/d' a.txt 删除所有空行
sed '/^$/{n;/^$/d}' 删除重复空行,连续两个空行只保留一个
sed '/^[rds]/d' a.txt 删除分别以r,d,s开头的行
sed -i '$d' /etc/passwd 删除文件的最后一行,修改原文件
----------------------------------------------------------------------
a/i添加行 (添加一行)
a 在当前行下方添加新行
i 在当前行上方添加新行
sed 'a内容' a.txt
echo cccccccccccc > a.txt
sed 'aFFFFFFFFF' a.txt 在没行的下方添加内容FFFF...
sed 'iFFFFFFFFF' a.txt 在没行的上方添加内容FFFF...
echo 11111111 >> a.txt
sed '$aFFFFFFFFF' a.txt 在最后一行的下方添加
sed '1aFFFFFFFFF' a.txt 在第一行添加
echo ccccccccccc >> a.txt
sed '/^c/aFFFFFFFFF' a.txt 在以c开头的行添加
sed -i '/^c/aFFFFFFFFF' a.txt 在以c开头的行添加,修改原文件
sed -i '$ayzs:x:2001:2001:tea:/home/yzs:/bin/bash' /etc/passwd 在最后一行的上边添加内容
sed '1,3aF' a.txt 在第123行的上边添加
sed -e 'aF' -e 'aX' -e 'aW' a.txt 在每行的上边分别都添加FXW,都隔行
--------------------------------------------------------------------
c替换行 (以行为替换单位)
sed 'c内容' a.txt
sed '条件c内容' a.txt
sed 'cPLJ' a.txt 把每行替换成PLJ
sed '1cPLJ' a.txt 把第一行替换成PLJ
sed '2,5cPLJ' a.txt 把第2345行替换成PLJ
sed -e '2cPLJ' -e '3cPLJ' a.txt 指定多个处理动作替换
sed -i '/^a/cT' a.txt 把以a开头的行替换成T -i处理原文件
--------------------------------------------------------------------
sed 's/aa/bb/' a.txt 将每行的第一个aa 替换成bb
sed 's/aa/bb/3' a.txt 将每行的第3个aa 替换成bb
sed 's/aa/bb/g' a.txt 将所有的aa 替换成bb
sed 's/aa//g' a.txt 将所有的aa删除
sed 's/aa/&s/g' a.txt 将所有的aa 替换成aabb,&代表前边的查找串
sed '4,7s/^/#/g' a.txt 将第4-7行注释掉
sed 's/^an#/an/' a.txt 去除以an开头行的注视
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
导入导出操作
r 读取文件 :
3r b.txt 在第3行文件下方插入文件b.txt
sed '3r b.txt' a.txt
4,7r b.txt 在第4-7行每一行的下方插入文件b.txt
sed '4,7r b.txt' a.txt
w 保存到文件:
3w c.txt 将第3行另存到文件c.txt
sed '3w c.txt' a.txt
4,7w c.txt 将第4-7行另存到文件c.txt
sed '4,7w c.txt' a.txt
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sed 复制剪切
基本动作
复制: H:模式空间--追加--保持空间
h:模式空间--覆盖--保持空间
粘贴: G:保持空间--追加--模式空间
g:保持空间--覆盖--模式空间
复制把文件1-2行复制到文件的末尾
sed -n '1h;2H;p' a.txt
剪切
把文件1-2行剪切到文件的末尾
sed '1h;2H;1,2d;$G' a.txt
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
后向引用 (-r 表示转义)
保存替换时的源数据,在替换时使用源数据做替换。最多用9个()
()()()()()()()()()
\1\2..............\9
sed -r '1s/(^.)(.*)/\1/' a.txt 把第一行替换成第一行的第一个字母
sed -r 's/(^.)(.*)/\1/' a.txt 把所有行替换成每一行的第一个字母
sed -r 's/(^.)(.*)/\2/' a.txt 把每一行第一个字符去掉
sed -r '1s/(^.)(.*)(.$)/\3\2\1/' a.txt 把第一行第一个字符和最后一个字符对调
sed -r '1s/(^.)(.*)(.$)/\2/' a.txt 把第一行的第一个字符和最后一个字符去掉
sed -r '1s/(^.)(.*)(.$)/\1\3/' a.txt 只保留第一行的第一个字符和最后一个字符
sed -r '1s/(^.)(.*)(.$)/\1abc\3/' a.txt 把第一行第一个字符和最后一个字符保留并且中间加字母abc
sed -r 's/(^.)(.*)(.$)/\1abc\3/' a.txt 把第每行的第一个字符和最后一个字符保留并且中间加字母abc
sed -r 's/(^.)(.*)(.$)/\2\3/' a.txt 把每行的第一个字符去掉
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
& 保存替换时的源数据
sed -r 's/^./[&]/' a.txt 把每行的第一个字符用[ ]扩起来
sed '2s/lisi/&user/' a.txt 把第二行的lisi后面加上字母user
sed '2s/lisi/[&]/' a.txt 把第二行的lisi用[ ]扩起来