如何通过正则表达式仅在指定行号替换目标单词
大文件指定行定点替换自动化方案
替换值可提前确定的批量场景
直接用sed命令一次性跑完所有替换,2000处修改几秒就能完成,不会有手动定位跳错行的问题。
- 命令自带备份参数,执行后会自动生成
.bak后缀的原文件备份,不用担心改坏文件:
sed -i.bak ' 25s/要替换的原词/25行对应的新值/; 55s/要替换的原词/55行对应的新值/; 181s/要替换的原词/181行对应的新值/; 1448s/要替换的原词/1448行对应的新值/; # 剩余规则按相同格式追加即可 ' 目标文件的本地路径
- 2000条规则不用手敲,提前把行号和对应替换值整理成两列的表格,用Excel或者几行简单脚本就能批量转成上面的规则格式,直接拼进命令就行。
- 补充说明:
sed匹配行号时用的是文件原始行号,哪怕前面的行改了内容、变了长度,后面的行匹配也不会错位;如果某一行里原词出现多次,单条规则末尾加g(比如25s/old/new/g)就能替换该行所有匹配的原词。
替换值需要逐处手动调整的场景
这种情况核心是省掉手动输行号跳转的步骤,实现一键顺次跳到待改位置,改完直接跳下一个,比手动用「转到行」功能快至少两倍:
- 用Vim/Neovim的话操作最方便:
- 先把所有待改的行号从小到大排序,每行一个存成纯文本文件
lines.txt - 打开要改的目标文件,在命令模式下粘贴执行下面的配置:
let g:todo_lines = readfile('lines.txt') let g:current_idx = 0 function! JumpNextTodo() if g:current_idx >= len(g:todo_lines) echo "所有待改位置已处理完" return endif exec 'normal! ' . g:todo_lines[g:current_idx] . 'G' let g:current_idx += 1 endfunction nnoremap <F2> :call JumpNextTodo()<CR>- 改的时候按F2就自动跳到第一个待改行,改完再按F2直接跳下一个,手不用离开键盘,也不会跳错行。
- 先把所有待改的行号从小到大排序,每行一个存成纯文本文件
- 用VS Code这类图形编辑器的话,可以把所有待改行号批量转成
文件名:行号的格式粘到内置终端,按住Ctrl点对应条目就能直接跳转;也可以装个书签扩展,把所有待改行批量加书签,用快捷键顺次跳书签就行。
注意事项
- 不管用哪种方法,改之前一定要留原文件备份,大文件改崩了恢复很麻烦。
- 如果手动逐行改的时候需要增删行内容,就从行号最大的位置往最小的位置改,避免前面增删行导致后面的行号对不上。
内容的提问来源于stack exchange,提问作者Kard Nails
相关产品推荐
相关产品推荐

