파일 1
pure info: myjob-relaed_rawmaterila
Timings: Full
pure info: Check-platform-Log-90Days
Timings: Full
Timings: Incremental
pure info: Check-vitorydows-Log-90Days
Timings: Full
Timings: Incremental
pure info: Note_michael
Timings: Full
pure info: adhoc-activity-myjob-platform
Timings: Full
pure info: adhoc-activity-myjob-vitory
Timings: Full
pure info: adhoc-myjob-platform-03
Timings: Full
Timings: Full-1month
pure info: adhoc-onetime-myjob-hotcase
Timings: Full
pure info: adhoc-onetime-myjob-platform
출력이 필요함
pure info: myjob-relaed_rawmaterila Timings: Full
pure info: Check-platform-Log-90Days Timings: Full Timings: Incremental
pure info: Check-vitorydows-Log-90Days Timings: Full Timings: Incremental
pure info: Note_michael Timings: Full
pure info: adhoc-activity-myjob-platform Timings: Full
pure info: adhoc-activity-myjob-vitory Timings: Full
pure info: adhoc-myjob-platform-03 Timings: Full Timings: Full-1month
pure info: adhoc-onetime-myjob-hotcase Timings: Full
나는 노력했다
cat file1|sed -e 's/^ //' -e 's/$//
cat file1|perl -pe's/\n/ / if $. % 3'
그러나 이는 연속으로 2줄만 인쇄합니다. 추가 Timings
항목이 있으면 들쭉날쭉한 출력이 됩니다.
이 문제를 어떻게 해결할 수 있나요?
답변1
Perl 솔루션과 관련하여 제공된 스크립트는 -p 구성으로 인해 입력을 한 줄씩 처리합니다. 선이 다음에 무슨 일이 일어날지 모르기 때문에 선 연결이 어려워집니다.
입력을 문자열로 처리할 때 스마트 대체를 수행하여 줄을 연결할 수 있습니다. 다음은 Perl을 호출하는 방법과 유사한 예입니다.
perl -e 'local $/;my $data = <>; $data =~ s/\nTiming/ Timing/g ; print $data' file1
스크립트는 문자열($data)의 전체 입력을 읽고 Timing 앞의 줄 바꿈을 공백으로 바꿉니다. 이는 모든 경우에 해당됩니다(g 스위치를 전역으로 교체).
답변2
GNU sed 솔루션:
sed -rz 's/\n(Timings)/ \1/g' file1
답변3
Perl 한 줄 버전:
perl -0777 -pe 's/\n(?=Timings:)/ /g' file
-0777 옵션은 Perl이 전체 파일을 $_
.
"타이밍" 옆에 다른 헤더가 있는 경우 부정적인 예측을 사용할 수 있습니다.
s/\n(?!pure info:)/ /g
답변4
사용진주:
perl -ne '
my $s = $_ if
/pure info:\s+myjob-relaed_rawmaterila/
..
/pure info:\s+adhoc-onetime-myjob-hotcase/;
do{
chomp;
s/\s{3,}/ /;
$_ = sprintf "%s ", $s;
s/pure info/\n$&/g;
print
} for $s;
END{ print "\n" }
' file1