한 줄을 다른 줄로 바꾸기

한 줄을 다른 줄로 바꾸기

파일이 있습니다

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하면 twith 태그는 스크립트 끝으로 분기되므로 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"

위 명령은 잘 실행됩니다.

관련 정보