如何替换文件多行内容?解决Sequelize模型主键自增缺失问题
解决Sequelize模型主键自增问题与多行内容替换方案
嘿,我完全懂你的痛点!sed的空格处理和多行匹配确实容易让人头大,尤其是Sequelize自动生成的模型代码格式有时候不统一,下面分两部分帮你搞定:
一、精准修复Sequelize主键自增的sed命令
针对你给出的例子,不管是单行还是多行格式的主键定义,我整理了两种可靠的sed命令,还附带备份避免误操作:
1. 单行主键定义的替换
如果你的主键是写在一行里的(比如id: { type: DataTypes.INTEGER.UNSIGNED, allowNull: false, primaryKey: true },),用这个命令批量处理所有模型文件:
sed -E -i.bak 's/(id: { type: DataTypes.INTEGER.UNSIGNED,)[[:space:]]*allowNull: false,[[:space:]]*(primaryKey: true })/\1 autoIncrement: true, \2/' ./models/*.js
-E:启用扩展正则,方便分组匹配-i.bak:修改文件的同时生成.bak备份,放心操作[[:space:]]*:匹配任意数量的空格(包括制表符),兼容不同格式的代码
2. 多行主键定义的替换
如果Sequelize把主键属性拆成了多行(比如下面这种):
id: { type: DataTypes.INTEGER.UNSIGNED, allowNull: false, primaryKey: true },
用sed的多行模式来匹配替换:
sed -E -i.bak '/id: {/{ :loop N /primaryKey: true/!b loop s/(id: {[[:space:]]*type: DataTypes.INTEGER.UNSIGNED,[[:space:]]*)allowNull: false,(.*primaryKey: true[[:space:]]*)}/\1autoIncrement: true,\2}/ }' ./models/*.js
这个命令会:
- 找到包含
id: {的行 - 不断读取下一行,直到找到包含
primaryKey: true的行 - 替换中间的
allowNull: false为autoIncrement: true,保留前后的格式
备选:用Perl简化多行替换
如果觉得sed的多行逻辑太绕,Perl的多行处理更直观,一行搞定跨行情况:
perl -i.bak -0pe 's/id: {\s*type: DataTypes.INTEGER.UNSIGNED,\s*allowNull: false,\s*primaryKey: true\s*}/id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true }/g' ./models/*.js
-0:开启多行模式,匹配跨行内容-pe:逐行处理并输出\s*:匹配任意空白字符(换行、空格、制表符)
二、通用的单/多文件多行内容替换方法
除了上面的特定场景,通用的多行替换可以参考这些思路:
1. sed多行替换模板
如果你需要替换任意多行内容,可以用这个结构:
sed -i.bak '/起始匹配行/{ N N # 多写几个N,直到覆盖你要替换的所有行 s/要替换的多行内容/新内容/g }' 目标文件路径
比如要替换3行内容,就写两个N(因为初始读一行,N读下一行,总共3行)。
2. awk多行替换
awk处理多行也很灵活,比如匹配起始行后,收集后续行直到结束标记:
awk '/起始标记/{flag=1; buf=$0; next} flag{buf=buf"\n"$0; if(/结束标记/){sub(/要替换的内容/, "新内容", buf); print buf; flag=0; next}} !flag{print}' 目标文件 > 临时文件 && mv 临时文件 目标文件
3. 编辑器批量替换(适合可视化操作)
如果命令行实在麻烦,用VS Code等编辑器的全局替换+正则模式也能搞定:
- 打开所有模型文件
- 按
Ctrl+Shift+F打开全局搜索,勾选正则选项 - 搜索框输入:
id: {\s*type: DataTypes.INTEGER.UNSIGNED,\s*allowNull: false,\s*primaryKey: true\s*} - 替换框输入:
id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true } - 点击替换所有即可
内容的提问来源于stack exchange,提问作者Fred Lackey
相关产品推荐
相关产品推荐

