[linux] sed

sed的原理是依次处理各行,把当前行储存在缓冲区中,称为“模式空间”,然后用sed命令依次处理,处理完成后,将缓冲区的内容输出到屏幕。

语法

1
sed [-option] 'command' filename

常用选项,例析:

  • -n : 安静模式,不输出到屏幕

    1
    2
    3
    $ echo -e 'hello world\nyfzm' | sed 's/hello/A/p'
    A world
    # p表示只把修改的内容打印出来,如果不加,就什么都不会输出
  • -e : 子命令

    1
    2
    $ echo -e 'hello world' | sed -e 's/hello/A/' -e 's/world/B/'
    A B
  • -i : 直接修改原文件

    1
    2
    3
    4
    5
    $ cat file.txt
    hello world
    $ sed -i 's/hello/A/' file.txt
    $ cat file.txt
    A world
  • -f : 使用包含多个sed命令的脚本

  • -r : 使用扩展的正则表达式

数字定址

数字定址规则 匹配项
n 第n行
n,m 第n到m行(包括m)
n,+m 从第n行起,再数m行(共m+1行)
n~m 从第n行起,每隔m行

替换子命令

command语法

1
[address]s/pattern/replacement/flags

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat message
hello 123 world
$ sed -r 's/([a-z]+)( [0-9]+ )([a-z]+)/\3\2\1/' message
world 123 hello
# 说明:\1表示正则第一个分组结果,\2表示正则匹配第二个分组结果,\3表示正则匹配第三个分组结果。
$
$ sed 's/l/A/g' message
worAd 123 heAAo
# 说明:把message文件中每行的所有l字符替换为A,默认不加g标记时只替换每行的第一个字符。
$
$ sed -n 's/l/A/w b.txt' message
# 说明:把message文件中内容的每行第一个字符l替换为A,然后把修改内容另存为b.txt文件。
$
$ sed -n 's/l/A/i' message
# 说明:把message文件中每一行的第一个l或L字符替换为A字符,也即是忽略大小写。