아래 표시된 입력 파일에서 문자열을 찾으려고 하는데 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_type
subst
\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 "~$/}