2017-12-28 44 views
0

ユーティリティのバグのため、一連の行を探して変更する必要があります。私はsedを使用しようとしていますが、macOSの構文を理解することはできません。このシーケンスが存在する場合は、最後の2行をsedを使用して複数行置換

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' 
    }); 
}; 
+0

あなたはsedを使用する必要はありますかあなたはほぼそのままであるperlのような何か他のものを使用することができます正規表現のためのコンパクト? – clocker

+0

この時点では、私は気にしません。私は成功なしで両方を試みました。私は正規表現を台無しにしていると思います。 –

+0

'sed'にはあなたの問題に使うことができるスタックバッファが付いていますが、一般的に' sed'は複数行の問題には使いにくいです。 – JawguyChooser

答えて

2

sedの複数パターン一致の場合は、を使用する必要があります次の行をパターン・スペースに引き込むコマンド。私はあなたの要件を理解していれば、このような何かをトリックにする必要があります。

$ 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ラインに。その後、あなたは、パターン空間の3行を持って、あなたが彼らに何をしたいの変更を行うことができます。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' 
    }); 
}; 
$ 

も参照のsedコマンドの詳細について説明しますUnixのスタック交換でこのポストは(もman sedはあなたの友達です):https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string#26290

+0

あなたは神のような力をこのカードで使うことができます... https://stackoverflow.com/questions/48010387/use-sed-file-to-replace-invalid-json-based-online-prefix –

+0

母、私は見てみましょう。しかし、複雑なマルチラインの作業をしているときは、完全に機能する(そして高水準の)プログラミング言語(PythonやPerl)にアップグレードする方が簡単です。乾杯! – JawguyChooser

+0

あなたは絶対に正しいです。それを考えてみると、私は一度だけ起こる線を置き換えているだけです。私は何も言わなかった。あなたはまだ男です。 –

関連する問題