Linux命令—sed

作用:用于处理文本的流编辑器.
命令格式

sed Options '[Address]Command' InputFile

对输入文件 InputFile 中的每行执行给定的命令 Command.
如果指定了地址 Address,则只对符合条件的文本行执行 Command 命令.
常用选项
  • -i: 原地修改,会改变源文件中的内容.
  • -n: 处理过程中,不要输出正在处理的文本行.
  • -r: 使用正则表达式扩展.
  • -f File: 从文件 File 中读取 sed 命令.
地址
  • n: 第 n 行.
[ming@localhost test]$ cat data.txt a a123 aa456 aaa789 b123 bb456 bbb789[ming@localhost test]$ sed -n '2p' data.txt a123

p: 打印行.
  • $: 最后一行.
[ming@localhost test]$ sed -n '$p' data.txt bbb789

  • /regexp/: 匹配指定正则表达式的行.
[ming@localhost test]$ sed -nr '/a+/p' data.txt a a123 aa456 aaa789[ming@localhost test]$ sed -nr '/a{2,}/p' data.txt aa456 aaa789

  • n~m: 从第 n 行开始,每 m 行便执行给定的命令.
[ming@localhost test]$ cat data.txt a a123 aa456 aaa789 b123 bb456 bbb789[ming@localhost test]$ sed -n '1~2p' data.txt a aa456 b123 bbb789

  • addr1,addr2: 从 addr1 开始,到 addr2 结束,包括首尾.
[ming@localhost test]$ sed -n '2,4p' data.txt a123 aa456 aaa789[ming@localhost test]$ sed -n '/123/,/123/p' data.txt a123 aa456 aaa789 b123

  • addr,+n: 从 addr 开始(包括),直到往后 n 行.
[ming@localhost test]$ sed -n '2,+2p' data.txt a123 aa456 aaa789[ming@localhost test]$ sed -nr '/a{3}/,+2p' data.txt aaa789 b123 bb456

1. 替换: s/regexp/replacement/
替换每行第一处匹配的地方:将 a 替换成 A
[ming@localhost test]$ sed 's/a/A/' data.txt A A123 Aa456 Aaa789 b123 bb456 bbb789

替换每行第 2 处匹配的地方:
[ming@localhost test]$ sed 's/a/A/2' data.txt a a123 aA456 aAa789 b123 bb456 bbb789

替换每行所有匹配的地方:g
[ming@localhost test]$ sed 's/a/A/g' data.txt A A123 AA456 AAA789 b123 bb456 bbb789

使用正则表达式:
[ming@localhost test]$ sed -r 's/[0-9]+/Number/' data.txt a aNumber aaNumber aaaNumber bNumber bbNumber bbbNumber

引用匹配的内容:&
[ming@localhost test]$ sed -r 's/[0-9]+/<&>/' data.txt a a<123> aa<456> aaa<789> b<123> bb<456> bbb<789>

引用匹配的分组:\n
[ming@localhost test]$ sed -r 's/a{1,3}([0-9]+)/<\1>/' data.txt a <123> <456> <789> b123 bb456 bbb789

\n: 引用第 n 个分组.
2. 删除行: d
[ming@localhost test]$ sed '/a\+/d' data.txt b123 bb456 bbb789

3. 插入行: i\a\
插到指定行之前:i\
[ming@localhost test]$ sed -r '/a+/i\line1\n\line2' data.txt line1 line2 a line1 line2 a123 line1 line2 aa456 line1 line2 aaa789 b123 bb456 bbb789

插到指定行之后:a\
[ming@localhost test]$ sed -r '/a+/a\line1' data.txt a line1 a123 line1 aa456 line1 aaa789 line1 b123 bb456 bbb789

4. 替换行: c\
[ming@localhost test]$ sed -r '/a+/c\line has a' data.txt line has a line has a line has a line has a b123 bb456 bbb789

5. 映射: y/source/dest/
[ming@localhost test]$ sed 'y/ab/AB/' data.txt A A123 AA456 AAA789 B123 BB456 BBB789

【Linux命令—sed】6. 读写文件
将指定的行写入指定的文件:w File
[ming@localhost test]$ sed -nr '/a+/w a.txt' data.txt [ming@localhost test]$ cat a.txt a a123 aa456 aaa789

读取文件内容,并将其插到指定行之后:r File
[ming@localhost test]$ cat input.txt ---- [ming@localhost test]$ sed -r '/a+/r input.txt' data.txt a ---- a123 ---- aa456 ---- aaa789 ---- b123 bb456 bbb789

7. 使用变量
[ming@localhost test]$ rpl="NUMBER" [ming@localhost test]$ sed -r 's/[0-9]+/'"$rpl"'/' data.txt a aNUMBER aaNUMBER aaaNUMBER bNUMBER bbNUMBER bbbNUMBER

8. 使用脚本文件
[ming@localhost test]$ cat script.sed /a+/ { i\a begin a\a end }s/[0-9]+/Number/[ming@localhost test]$ sed -rf script.sed data.txt a begin a a end a begin aNumber a end a begin aaNumber a end a begin aaaNumber a end bNumber bbNumber bbbNumber

    推荐阅读