gpt4 book ai didi

bash - 使用 sed 进行多行替换

转载 作者:行者123 更新时间:2023-12-03 22:23:45 25 4
gpt4 key购买 nike

由于实用程序中的错误,我需要找到一系列行并对其进行更改。我一直在尝试使用 sed 但无法弄清楚 macOS 上的语法。

基本上,我需要找到以下几行:

type: DataTypes.DATE,
allowNull: true,
primaryKey: true

...并更改最后两行,如果此序列存在:
type: DataTypes.DATE,
allowNull: true

整个文件最初看起来是这样的:
/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
return sequelize.define('product', {
id: {
type: DataTypes.BIGINT,
allowNull: false,
primaryKey: true
},
name: {
type: DataTypes.STRING,
allowNull: false,
primaryKey: true
},
_u: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'user',
key: 'id'
}
},
_v: {
type: DataTypes.DATE,
allowNull: false
},
_d: {
type: DataTypes.DATE,
allowNull: true,
primaryKey: true
}
}, {
tableName: 'product'
});
};

最佳答案

对于 sed 中的多行模式匹配,您将需要使用 N 命令将下一行拉入模式空间。如果我理解你的要求,这样的事情应该能解决问题:

$ cat multiline-replace.sed 
/type: DataTypes.DATE,/{N
/allowNull: true/{N
/primaryKey: true/{
s/allowNull: true/why would I allow this?/
s/primaryKey: true/shmimaryKey: false/
}
}
}

这个想法是,当 /type: DataTypes.DATE,/ 匹配时,您将下一行读入模式空间(范围由 {} 分隔。在 allowNull: true 行和 primaryKey: true 行上做同样的事情。然后你在模式空间中得到了三行你可以对它们进行你想做的修改。 s/pattern/replacement/

我将您的输入复制到文件 input 中,然后针对此程序对其进行了测试:
$ cat input | sed -f multiline-replace.sed 
/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
return sequelize.define('product', {
id: {
type: DataTypes.BIGINT,
allowNull: false,
primaryKey: true
},
name: {
type: DataTypes.STRING,
allowNull: false,
primaryKey: true
},
_u: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'user',
key: 'id'
}
},
_v: {
type: DataTypes.DATE,
allowNull: false
},
_d: {
type: DataTypes.DATE,
why would I allow this?,
shmimaryKey: false
}
}, {
tableName: 'product'
});
};
$

另请参阅有关 Unix 堆栈交换的这篇文章,其中提供了有关 sed 命令的更多详细信息( man sed 也是您的 friend ): https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string#26290

关于bash - 使用 sed 进行多行替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48001103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com