文本内容替换

#linux

1. sed 命令

1.1 基本语法

sed -i 's/regexp/replacement/flags' file

参数说明

1.2 常用示例

替换单个文件

# 把所有的 http 替换成 https
sed -i 's/http/https/g' config.txt

# 删除所有空行
sed -i '/^$/d' file.txt

# 替换时忽略大小写
sed -i 's/error/ERROR/gi' log.txt

批量替换多个文件

# 替换当前目录所有 .txt 文件
sed -i 's/old/new/g' *.txt

# 递归替换所有 .md 文件
find . -name "*.md" -exec sed -i 's/old/new/g' {} \;

先预览再替换(去掉 -i 参数):

# 先看看会替换成什么样
sed 's/old/new/g' file.txt

# 确认没问题再加 -i 真正替换
sed -i 's/old/new/g' file.txt

正则表达式示例

# 替换 IP 地址
sed -i 's/192\.168\.1\.[0-9]\+/10.0.0.1/g' hosts.txt

# 删除行尾空格
sed -i 's/[[:space:]]*$//' file.txt

# 替换多个连续空格为一个
sed -i 's/  \+/ /g' file.txt

2. Vim 编辑

进入命令模式(按 :),然后输入替换命令。

2.1 替换命令对比

命令 作用
s/old/new 替换当前行第一个匹配
s/old/new/g 替换当前行所有匹配
%s/old/new 替换每一行第一个匹配
%s/old/new/g 替换整个文件所有匹配(最常用)
%s/old/new/gc 替换前逐个确认
%s/old/new/gi 忽略大小写替换

2.2 常用示例

基本替换

" 替换整个文件的所有 http 为 https
:%s/http/https/g

" 替换时逐个确认(会提示 y/n/a/q)
:%s/old/new/gc

" 忽略大小写替换
:%s/error/ERROR/gi

指定行范围替换

" 替换第 10-20 行
:10,20s/old/new/g

" 替换当前行到文件末尾
:.,$s/old/new/g

" 替换前 5 行
:1,5s/old/new/g

正则表达式替换

" 删除所有空行
:%s/^$//g

" 删除行尾空格
:%s/\s\+$//g

" 给每行开头加上 # 注释
:%s/^/# /g

" 删除所有 HTML 标签
:%s/<[^>]*>//g

可视模式下替换

  1. vV 进入可视模式,选中要替换的区域
  2. : 会自动出现 :'<,'>
  3. 输入 s/old/new/g 完成替换
" 选中区域后会自动变成这样
:'<,'>s/old/new/g