sed命令

Catalogue
  1. 1. 在指定行前后插入一行
  2. 2. 在指定的多行前后插入
  3. 3. 删除指定行
  4. 4. 替换
  5. 5. 查找
  6. 6. 删除
  7. 7. 查找某个字符然后替换其他
  8. 8. 查找某行容纳后替换该行的字符
  9. 9. M-BM- 字符问题
  10. 10. 查找文件中某一行内容
  11. 11. 提取文本最后一行
  12. 12. sed -i默认不检查软链接!!!

在指定行前后插入一行

1
2
3
4
5
6
7
8
sed -i '$行数i 字符串' 文件
-i 直接修改文件(如果指定扩展名就备份文件)

**在第一行前插入文本**
sed -i '1i ttt' a.txt

**在第一行后插入文本**
sed -i '1a ttt' a.txt

在指定的多行前后插入

1
2
3
4
5
6
7
sed -i '$行数,$行数i 字符串' 文件

在指定的多行前面插入
sed -i 'n,mi ttt' a.txt

在指定的多行后面插入
sed -i 'n,ma ttt' a.txt

删除指定行

1
2
3
4
sed -i 2d a.txt

删除模板的第一行
sed -i D a.txt

替换

1
2
3
4
5
6
7
8
把文件filename中的a字符换成A字符
sed -i "s/a/A/g" filename

批量替换 替换dir文件夹下所有文件中的a字符变成A字符
sed -i "s/a/A/g" `grep a -rl dir/`

替换为空格 将tab替换为空格
sed -i "s/\t/ /g" filename

查找

1
sed -n '/^PermitRootLogin yes/'p /etc/ssh/sshd_config

删除

1
sed -i '/PermitRootLogin yes/d' /etc/ssh/sshd_config

查找某个字符然后替换其他

1
sed -i '/sshd:all/s/sshd/#sshd/g' /etc/hosts.deny

查找某行容纳后替换该行的字符

1
sed -i ''$lostlinenum's/$/ 数据丢失/' /tmp/purebd

M-BM- 字符问题

1
sed -i 's/\xc2\xa0/ /g'

查找文件中某一行内容

1
2
3
4
5
查找文件text中第三行的内容
sed -n '3p' text

查找文件text中第二行到第四行的内容
命令: sed -n '2,4p' text

提取文本最后一行

1
2
3
sed -n '$p'

sed '$!N;$!D'

sed -i默认不检查软链接!!!

sed的-i / –in-place参数可以直接修改文件。但是,默认情况下,sed在读取文件之前不会检查文件是否是软链接,所以sed转换之后覆盖原文件(sed相当于将原文件通过流方式过滤改成,然后通过管道生成临时文件,然后删除掉原文件,再将临时文件重命名成原文件)。这就导致了如果原文件是一个软链接,就会在修改后转变成实体文件。

GNU sed 提供了一个–follow-symlinks参数,可以检测修改的是软链接,而实现对软链接指向的实体文件的修改,避免破坏软链接。案例如下:

1
sed -i --follow-symlinks 's/cat/dog/' /etc/rc.local

参考:如何避免sed -i破坏文件的软链接