[toc]
sed命令
1.sed命令工作流程
1.输入流
- sed 从标准输入(如管道或文件)读取文本行。你可以将文件名作为参数传递给 sed,或者通过管道将输出传递给 sed。
2.模式匹配
- 对每一行输入,sed 将根据提供的模式(通常是正则表达式)进行匹配。模式可以指定哪些行或文本需要进行处理。
3.操作
- 根据匹配结果,sed 执行相应的操作。常见的操作包括:
- 替换(s/pattern/replacement/):用替换字符串替换匹配的模式。
- 删除(d):删除匹配的行。
- 插入(i)或 追加(a):在匹配行之前或之后插入文本。
- 打印(p):打印匹配的行。
4.输出:
- 处理完所有输入行后,sed 将结果输出到标准输出。
- 默认情况下,它会输出所有未被删除的行。如果使用了
-n
选项,则只输出被打印操作处理过的行。 - 默认情况下,sed将修改的行输出到屏幕,并没有修改源文件,使用
-i
选项修改源文件
- 默认情况下,它会输出所有未被删除的行。如果使用了
2.命令格式
sed 选项 地址1,地址2 命令 标记 文件名
3.选项
3.1 -n
拟制输出,不输出未修改的行,强制输出用命令 p
创建示例文件
cat > test.txt << EOF
line 1
line 2
line 3
EOF
这里,/line 2/p
表示匹配包含 line 2
的行,并打印它。由于使用了 -n
选项,只有匹配的行被打印,其他行不会自动输出
$ sed -n '/line 2/p' test.txt
line 2
$ sed '/line 2/p' test.txt
line 1
line 2
line 2
line 3
3.2 -i
修改源文件,需要备份源文件 -i.bak
即可
不加 -i
不修改源文件
$ sed 's/line/abc/' test.txt
abc 1
abc 2
abc 3
$ cat test.txt
line 1
line 2
line 3
加 -i
修改源文件
$ sed -i 's/line/abc/' test.txt
$ cat test.txt
abc 1
abc 2
abc 3
3.3 -r
让sed支持扩展正则表达式,默认支持标准正则表达式
说明
使用 -r
选项后,正则表达式中的一些特殊字符可以直接使用,而不需要反斜杠进行转义,例如:
+
:匹配前一个字符或子表达式一次或多次。?
:匹配前一个字符或子表达式零次或一次。|
:表示逻辑“或”,匹配多个模式中的任意一个。()
:用于分组,不需要加反斜杠。
创建示例文件
cat > test.txt << EOF
apple
apples
banana
bananas
EOF
不加 -r
$ sed 's/(apple|banana)s?/\1s/g' test.txt
sed: -e expression #1, char 24: invalid reference \1 on `s' command's RHS
加 -r
$ sed -r 's/(apple|banana)s?/\1s/g' test.txt
apples
apples
bananas
bananas
3.4 -f
从文件中读取 sed
命令
创建一个包含 sed
命令的文件
cat > commands.sed << EOF
s/foo/bar/g # 替换所有的 'foo' 为 'bar'
/baz/d # 删除包含 'baz' 的行
i\Insert Text # 在文件开头插入 'Insert Text'
EOF
创建一个测试文件
cat > input.txt << EOF
foo is a placeholder
this is a test
baz is here
foo again
EOF
执行命令
$ sed -f commands.sed input.txt
Insert Text # 在文件开头插入 'Insert Text'
bar is a placeholder
Insert Text # 在文件开头插入 'Insert Text'
this is a test
Insert Text # 在文件开头插入 'Insert Text'
bar again
3.5 -e
允许一条命令执行多个sed子命令
创建示例文件
cat > test.txt << EOF
apple pie
banana split
cherry tart
EOF
同时替换 apple
为 fruit
,并将 banana
替换为 dessert
$ sed -e 's/apple/fruit/' -e 's/banana/dessert/' test.txt
fruit pie
dessert split
cherry tart
可以结合删除和替换操作,比如想删除包含 cherry
的行,并将 pie
替换为 cake
$ sed -e '/cherry/d' -e 's/pie/cake/' test.txt
apple cake
banana split
4.定位、匹配
4.1 使用行号
创建示例文件
cat > test.txt << EOF
111
abc
111
fgh
333
iop
789
EOF
定位1-5行 1,5
$ sed '1,5s#111#999#' test.txt
999
abc
999
fgh
333
iop
789
定位到最后一行 $
$ sed '$s#789#AAA#' test.txt
111
abc
111
fgh
333
iop
AAA