패턴 일치 후 행을 다음 행으로 분할

패턴 일치 후 행을 다음 행으로 분할

아래 표시된 입력 파일에서 문자열을 찾으려고 하는데 job_type, job_type과 일치하면 다음 줄로 이동합니다.

나는 이것을 시도했지만 작동하지 않습니다.

sed "s/[A-Z][a-z]*job_type:/\njob_type:/g"

입력하다:

    insert_job: VAU_vaultnotification_ertgvfg_job job_type: xxx 
    insert_job: VAU_vaultnotification_ertgvfg_frd job_type: yyy 
    insert_job: VAU_vaultnotification_ertgvfg_erb job_type: SXC 
     job_type: CMD
    insert_job: VAU_vaultnotification_ertgvfg_frd job_type: YUI 

예상 출력:

insert_job: VAU_vaultnotification_ertgvfg_job 
job_type: xxx 
insert_job: VAU_vaultnotification_ertgvfg_frd 
job_type: yyy 
insert_job: VAU_vaultnotification_ertgvfg_erb 
job_type: SXC 
 job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd 
job_type: YUI 

답변1

당신이 무엇을 요구하는지 잘 모르겠지만 아마도 당신은 다음을 원할 것입니다:

sed 's/\([[:upper:]][[:alpha:]_]*\)[[:space:]]\{1,\}\(job_type:\)/\1\
\2/g'

또는:

perl -Mopen=locale -pe 's/\b\p{Lu}\w*\K\s+(job_type:)/\n$1/g'

답변2

나는 비슷한 일을 하기 위해 GNU를 사용할 것입니다 sed:

sed '/insert_job/s/job_type/\njob_type/'

첫 번째 부분은 /insert_job/교체 전 라인과 일치합니다. "insert_job"(또는 원하는 정규식)이 발견되지 않으면 교체가 수행되지 않습니다.

답변3

GNU 사용sed

$ sed '/ \+\(insert_job.*\)\(job_type:.*\)/s//\1\n\2/' input_file
insert_job: VAU_vaultnotification_ertgvfg_job
job_type: xxx
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: yyy
insert_job: VAU_vaultnotification_ertgvfg_erb
job_type: SXC
     job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: YUI

답변4

사용행복하다(이전 Perl_6)

수정될 모든 행에 공백으로 구분된 "열"이 4개 이상 포함되어 있다고 가정합니다. "열"이 4개 미만인 행은 수정되지 않은 상태로 반환됩니다.

raku -ne 'my @a = .words; @a.elems >= 4 ?? put @a[0..1], "\n", @a[2..*] !! put @a;' 

위의 내용은 입력에 문자열 패턴이 없고 적절한 수의 공백 구분 기호 words(예: 열)만 있다고 가정합니다. 일치하는 행의 경우 처음 2개 열을 반환한 다음 줄 바꿈, 나머지 열을 반환합니다(OP는 문자열이 job_type세 번째 열에서 시작하는 입력 예시를 제공했습니다).

그러나 정규식을 사용하고 문자열 패턴을 검색하려는 경우 Raku가 지원해 드립니다( subst연산자 사용). 아래에서 Raku는 문자열 시작 부분과 문자열 끝 부분의 너비가 0인 어설션(앵커) / ^ ... $ /사이에서 8개의 정규식 원자를 검색합니다 . 일치가 이루어지면 Raku의 캡처 플래그는 일치 이전의 모든 항목을 삭제하는 데 사용됩니다. 그런 다음 교체된 절반에서 개행 문자가 일치 변수에 연결되어 반환됩니다.^$<(job_typesubst\n~$/

raku -ne '.subst(/^ insert_job\: \s .+? \s <(job_type\: \s \w* \s*? $/, {"\n"~$/} ).put;'

입력 예:

insert_job: VAU_vaultnotification_ertgvfg_job job_type: xxx 
insert_job: VAU_vaultnotification_ertgvfg_frd job_type: yyy 
insert_job: VAU_vaultnotification_ertgvfg_erb job_type: SXC 
 job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd job_type: YUI

출력 예(위의 첫 번째 코드 예):

insert_job: VAU_vaultnotification_ertgvfg_job
job_type: xxx
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: yyy
insert_job: VAU_vaultnotification_ertgvfg_erb
job_type: SXC
job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: YUI

OP에서는 모든 출력을 왼쪽 정렬해야 하는지(선행 공백 문자 0개) 여부를 명확하게 밝히지 않았습니다. 위의 첫 번째 답변은 왼쪽 정렬되어 있지만 출력에서 ​​다음으로 시작하는 모든 줄을 trim들여쓰기 하는 것이 쉽습니다 (예: 두 번째 답변에서 바꾸기를 사용하면 들여쓰기됩니다).job_type{"\n "~$/}

https://raku.org

관련 정보