2017-12-28 39 views
0

유틸리티의 버그로 인해 일련의 줄을 찾아 변경해야합니다. 나는 sed을 사용하려했지만 macOS에서 구문을 이해할 수 없습니다. 이 순서가있는 경우 마지막 두 줄을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

당신이 나오지 사용해야하는거나 거의 같다 펄 같은 다른 뭔가를 사용할 수 있습니다 정규식 컴팩트? – 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으로 입력을 복사 I 이 프로그램에 대해 테스트 :

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

(또한 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

하하, 내가 살펴 보겠다. 하지만 복잡한 멀티 라인 작업을 수행 할 때는 완전한 기능을 갖춘 (그리고 높은 수준의) 프로그래밍 언어 (파이썬 또는 펄)로 업그레이드하는 것이 일반적으로 더 쉽습니다. 건배! – JawguyChooser

+0

당신은 절대적으로 옳습니다. 생각 해보니, 한 번만 발생하는 줄을 바꾸는 것뿐입니다. 내가 말한 것을 잊어 버려. 너는 여전히 남자 야. –