파일이 있습니다
Line 1
Line 2 MATCH
Line 3
Line 4
Line 1
Line 2 MATCH
Line 3
Line 4
각 경우에 대해 "MATCH"와 "Line 1"로 줄을 바꾸고 싶습니다. 다른 질문을 검색해 보았지만 일치하는 줄이 마지막 줄로 이동하고 최종 출력을 얻기 위해 내 버전을 다시 만드는 코드를 잘 이해하지 못합니다. 예를 들면 다음과 같습니다.
Line 2 MATCH
Line 1
Line 3
Line 4
Line 2 MATCH
Line 1
Line 3
Line 4
답변1
sed
그리고 사용N;P;D cycle
:
sed -e '$!N;s/\(Line 1\)\(\n\)\(.*MATCH.*\)/\3\2\1/;t' -e 'P;D' infile
이것은 with 줄 MATCH
앞에 ::가 있는 경우에만 교체됩니다. 성공 Line 1
하면 t
with 태그는 스크립트 끝으로 분기되므로 Line 1
뒤에 연속 줄이 있으면 다시 교체하는 것을 피할 수 있습니다 MATCH
. 선행/후행 공백을 조정하는 정규식입니다.
답변2
행을 이전 행과 바꾸는 것이 아이디어라면 MATCH
다음과 같이 할 수 있습니다.
$ awk '!/MATCH/ { if (NR > 1) print prev; prev=$0}
/MATCH/ {print $0;}
END {print prev}' < file
Line 2 MATCH
Line 1
Line 3
Line 4
Line 2 MATCH
Line 1
Line 3
Line 4
스크립트는 의 이전 줄을 유지 prev
하고 일치하지 않는 줄을 인쇄한 후 업데이트합니다. 패턴과 일치하는 줄에서는 현재 줄을 인쇄하고 다음 줄이 인쇄되도록 변수에 이전 줄을 남겨 둡니다.
NR==1
인쇄할 이전 행이 없고 END
예약된 행을 인쇄할 때 첫 번째 행( )에 대한 특별한 경우입니다.
답변3
사용 ed
:
$ printf 'g/MATCH/m-2\n,p\n' | ed -s file
Line 2 MATCH
Line 1
Line 3
Line 4
Line 2 MATCH
Line 1
Line 3
Line 4
이 m
명령은 현재 행을 다음 대상 주소로 이동합니다. 여기에서 일치하는 모든 줄을 찾고 MATCH
(앞의 정규식은 g
이를 "전역" 작업으로 만듭니다) 각 줄에 대해 한 줄 위로 이동합니다("이 줄 다음 두 줄 위로"). 그 효과는 이 MATCH
줄이 이전 줄과 위치를 바꾸는 것입니다.
편집 스크립트의 마지막 부분에는 ,p
수정된 편집 버퍼만 표시됩니다. 이는 wq
변경된 편집 버퍼를 원본 파일에 다시 쓰는 것과 같이 변경될 수 있습니다 .
파일을 편집할 때는 ed
깔끔하게 보일 수 있지만 전체 파일을 메모리로 읽어들이기 때문에 대용량 파일에는 권장되지 않습니다.
답변4
sed "s/line 2 match//g"|sed "s/line 1/line 2 match\n&/g"
위 명령은 잘 실행됩니다.