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字符,也即是忽略大小写。