用 sed 替换多行

Replacing multiline with sed

我要更换

@Column("uuid", {
   primary: true,
   name: "id",
   default: () => "uuid_generate_v4()",
})

@PrimaryGeneratedColumn

在包含以下内容的文件中:

export class SomeClass {
  @Column("uuid", {
    primary: true,
    name: "id",
    default: () => "uuid_generate_v4()",
  })
  id: string;

  @Column("timestamp with time zone", {
    name: "created_at",
    default: () => "now()",
  })
  created_at: Date;

  @Column("timestamp with time zone", {
    name: "updated_at",
    default: () => "now()",
  })
  updated_at: Date;

  @Column("uuid", { name: "other_id", unique: true })
  other_id: string;
}

这是我目前的解决方案:

sed -E -i '' -e '/@Column\(\"uuid\", \{/,/\}\)?/c  @PrimaryGeneratedColumn\(\"uuid\"\)' fileName

基本可以,就是太不准确了,还替换了其他不该替换的台词。我尝试添加 uuid_generate_v4() 但无法使其正常工作,可能是因为换行符。

这可能适合您 (GNU sed):

sed '/@Column("uuid"/{:a;N;/^\s*})$/M!ba;/"uuid_generate_v4()/s/.*/@PrimaryGeneratedColum/}' file

收集包含 @Column("uuid"}) 的行,如果这些行也包含 uid_generate_v4(),请将它们全部替换为 PrimaryGeneratedColum

使用 sed,您可以锚定范围的末尾以阻止它与重复范围匹配。

$ sed -i '' -e '/@Column("uuid", {$/,/})/c\@PrimaryGeneratedColumn' input_file 
rt class SomeClass {
@PrimaryGeneratedColumn
  id: string;

  @Column("timestamp with time zone", {
    name: "created_at",
    default: () => "now()",
  })
  created_at: Date;

  @Column("timestamp with time zone", {
    name: "updated_at",
    default: () => "now()",
  })
  updated_at: Date;

  @Column("uuid", { name: "other_id", unique: true })
  other_id: string;
}