일치하는 줄을 일치하는 줄의 끝 바로 다음 줄로 이동합니다.

일치하는 줄을 일치하는 줄의 끝 바로 다음 줄로 이동합니다.

그런 입력이 있습니다. job_type인 경우 *_job 뒤의 줄을 *_job 줄 끝으로 이동하고 전체 파일을 인쇄해야 합니다. 다음 줄이 job_type이 아니면 인쇄합니다.

SED를 통해 *_job이 포함된 행만 인쇄할 수 있지만 전체 파일은 인쇄할 수 없습니다. 누구든지 도와주실 수 있나요?

 sed -i -n '/.*_job: .*/{h}; /job_type.*/{H;x;s/\n/ /;p}'

입력하다.

update_job: YUHG_GHT_FGT_BOX
job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX
job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj
job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

insert_job: YU_opoj_BOX
job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

예상 O/P:-

update_job: YUHG_GHT_FGT_BOX job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

답변1

넌 할 수있어:

sed '/_job/{N;/\
job_type/s/\
/ /;}' infile

줄이 포함되어 있으면 확장 줄을 _job읽어 N패턴 공간에 추가하고 포함된 \n줄 바꿈 문자를 제거합니다(여기서는 줄을 백슬래시로 분해한 \다음 실제 줄 바꿈을 사용하여 실제 줄 바꿈을 사용합니다). job_type.

답변2

Perl을 사용하여 단락 모드( )에서 파일을 읽고 -00Perl의 /m정규식 수정자를 사용하면 단일 정규식을 사용하여 여러 줄 문자열을 처리할 수 있습니다.

$ perl -00 -p -e 's/(_job:.*?)\n(job_type:)/$1 $2/mg' input.txt
update_job: YUHG_GHT_FGT_BOX job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

_job:이는 다음을 포함하는 줄 사이의 개행 문자를 효과적으로 대체합니다.이어서job_type공백 으로 시작하는 줄 입니다. 정확한 기준과 일치하지 않는 행은 변경되지 않습니다.

(_job:.*?)두 개의 캡처 그룹 과 (job_type:)및 Perl의 탐욕스럽지 않은 정규식 수량자를 사용하여 ?첫 번째 캡처 그룹이 _job:이전의 모든 것과 만 일치하도록 합니다.첫 번째그런 다음 다음 줄 _job:(즉, 줄의 나머지 부분)로 줄 바꿈합니다.

그런데, 줄 끝에 후행 공백이 있거나 줄 앞에 선행 공백이 있는 _job:경우 정규 표현식을 다음으로 변경하세요.jobtype:\n\s*\n\s*

와 마찬가지로 sed표준 출력으로 인쇄하는 대신 원본 파일을 수정하려는 경우 이 옵션을 사용할 수 있습니다.-i

답변3

Perl에서는 간단합니다.

perl -pi -e 'tr/\n/ / if /_job/' -- file
  • -p입력된 내용을 한 줄씩 읽고 처리 후 각 줄을 인쇄합니다.
  • -i제자리에서 파일 변경
  • tr/\n/ /개행 문자를 공백으로 바꾸기
  • if /_job/조건이 참인 경우에만(즉, 줄에 _job.

답변4

그리고 ed:

printf '%s\n' 'g/^job_type:/ s/^/ /\' '-1,.j' ',p' 'Q' | ed -s file

스크립트 편집:

g/^job_type:/ s/^/ /\
-1,.j
,p
Q

이는 리터럴 문자열로 시작하는 편집 버퍼의 모든 행에 바꾸기 명령( s)과 조인 명령( )을 적용합니다 . 바꾸기는 줄 시작 부분에 공백을 삽입하고, Join 명령은 영향을 받은 줄을 버퍼의 이전 줄과 결합합니다.jjob_type:

후행 pQ명령은 수정된 버퍼를 터미널에 인쇄하고 종료됩니다. wq내부 편집을 수행하려면 결과를 원본 파일에 다시 쓰도록 변경하면 됩니다.

관련 정보