sed
在 shell 脚本中的实践案例非常丰富,下面是一些典型应用:
替换操作
替换文件中特定的文本:
# 将 test.txt 文件中所有的 "old" 替换为 "new" sed -i 's/old/new/g' test.txt
-i
参数表示直接编辑原文件。如果不使用-i
,则只会显示替换后的结果,而不修改原文件。仅替换每一行的第一个匹配项:
# 只替换每一行第一个出现的 "foo" sed '0,/$/s/foo/bar/' file.txt
删除操作
删除包含指定模式的行:
# 删除包含 "error" 的行 sed '/error/d' log.txt
删除指定行范围:
# 删除第 5 到第 10 行 sed '5,10d' input.txt
插入与追加
在每一行后追加文本:
# 在每一行末尾添加字符串 ".txt" sed 's/$/.txt/' names > new_names.txt
在特定行之前或之后插入文本:
# 在匹配 "start-marker" 的行之后插入一行内容 sed '/start-marker/a\New line content\n' file.txt # 或者,在所有行之后追加新的内容 sed -i '$a\Additional line' file.txt
打印特定行
打印匹配正则表达式的行:
# 打印包含 "root" 的行 sed -n '/root/p' /etc/passwd
打印指定行号范围:
# 打印文件的第 3 至第 5 行 sed -n '3,5p' file.txt
多行处理
- 处理多行模式(如括号匹配):
# 使用扩展正则表达式(-E)匹配以 `begin` 开始并以 `end` 结束的多行块,并对其进行替换 sed -E '/begin/{:a;N;/end/!ba;s/(begin.*end)/replacement/}' multi_line_file.txt
格式转换和提取信息
- 提取日志中的IP地址:
# 假设日志格式为:access from [192.168.1.1] sed 's/.*from \[\([^]]*\)\].*/\1/p' access_log.txt
以上都是 sed
在实际脚本编写中的常见应用场景,实际上它还可以进行更复杂的文本处理,包括根据条件分支执行不同的命令等。