그런 입력이 있습니다. 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을 사용하여 단락 모드( )에서 파일을 읽고 -00
Perl의 /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 명령은 영향을 받은 줄을 버퍼의 이전 줄과 결합합니다.j
job_type:
후행 p
및 Q
명령은 수정된 버퍼를 터미널에 인쇄하고 종료됩니다. wq
내부 편집을 수행하려면 결과를 원본 파일에 다시 쓰도록 변경하면 됩니다.