sed를 3줄 슬라이딩 창으로 교체

sed를 3줄 슬라이딩 창으로 교체

큰 텍스트 파일에 나타나는 다음 3줄 그룹을 변경하려면 Sed를 사용하여 3줄 슬라이딩 창을 구현해야 합니다.

Fax: 05.11.22.33.44<LF>
<LF>
<LF>

이것으로:

Fax: 05.11.22.33.44<LF>
###
<LF>

이 작업을 수행하기 위해 다음 명령줄을 사용해 보았습니다(sed는 msdos 배치 파일에서 실행되지만 내 Linux bash에서도 작동하지 않습니다).

sed -i ":a;$!N;s/\nFax: \([ 0-9\.]*\n\n\);tenough;$!ba;:enough/\nFax: \1###\n/;$!ba;P;D" file.txt

뭐가 문제 야?

답변1

당신 추측이 P;D맞았어. 남은 것은 교체가 성공할 때까지 패턴 공간에서 문자열을 끌어오려는 시도가 실패한 것입니다. 이는 반드시 나쁜 것은 아니지만 확실히 슬라이딩 창이 아닙니다.
첫 번째 줄에서 한 행을 가져온 다음 사용해야 합니다.N;P;D루프(따라서 패턴 공간에 항상 세 개의 라인이 있음) 및 새 라인을 가져올 때마다 교체를 시도합니다.

sed '1N;$!N;s/\(PATTERN\n\)\(\n\)$/\1###\2/;P;D' infile

답변2

생각하다이는 원래 시도한 구현에 가깝습니다.

sed ':a; $q; N; s/\(Fax:.*\n\)\n$/\1###\n/; 3,${P;D}; ba'

전임자.

$ sed ':a; $q; N; s/\(Fax:.*\n\)\n$/\1###\n/; 3,${P;D}; ba' input > output
$ diff -y input output
Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44

Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
                                                              | ###

Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
                                                              | ###

Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44

요령은 3,${P;D}이것이 3줄 창을 유지하는 것입니다(루프를 통해 매번 패턴 공간에서 한 줄을 터뜨리지만 줄 수가 3에 도달한 후에만).

답변3

Steeldriver의 솔루션에는 장점이 있습니다. 5개 생산 라인에서 작동할 수 있고 7개 이상의 생산 라인에서도 작동할 수 있습니다. 내 예에서는 일치하는 행을 찾고 이전 두 행, 일치하는 행과 다음 두 행을 해당 행의 첫 번째 부분으로 바꾼 다음 기존 값을 빈 "목록" 값으로 바꿉니다.

입력이 잘리고 처음에는 줄 길이가 2000보다 큽니다.

Frame 64 (List 213 [(LM 0 0 836 216 112 0.681952 0.260603)])
Frame 65 (List 236 [(LM 0 0 836 216 112 0.680071 0.187739)])
Frame 66 (List 235 [(LM 0 0 836 216 112 0.678168 0.315848)])
Frame 67 (List 98 [(LM 149 129 1456 216 112 0.525970 11.970105)])
Frame 68 (List 217 [(LM 0 4 1084 216 112 0.837058 0.658243)])
Frame 69 (List 212 [(LM 0 0 1084 216 112 0.829624 0.339764)])
Frame 70 (List 218 [(LM 0 0 1084 216 112 0.829624 0.200893)])

67행(비정상 값)과 일치하는 Sed 명령은 다음과 같습니다.

sed -re ":a; $q; N; s/(Frame .[0-9] ).*(Frame .[0-9] ).*(Frame .[0-9] ).*LM\ [0-9][0-9][0-9].*(Frame .[0-9] ).*(Frame .[0-9] ).*/\1(List 0 \[\]\)\n\2\(List 0 \[\]\)\n\3\(List 0 \[\]\)\n\4\(List 0 \[\]\)\n\5\(List 0 \[\]\)/; 5,${P;D}; ba" transform1.trf > transform2.trf

sed 명령은 프레임 67과 일치하며 출력은 다음과 같습니다.

Frame 64 (List 213 [(LM 0 0 836 216 112 0.681952 0.260603) <cut>])
Frame 65 (List 0 [])
Frame 66 (List 0 [])
Frame 67 (List 0 [])
Frame 68 (List 0 [])
Frame 69 (List 0 [])
Frame 70 (List 218 [(LM 0 0 1084 216 112 0.829624 0.200893) <cut>])

이봐https://trac.ffmpeg.org/ticket/6816내가 이걸 왜 찾고 있는 걸까요? 이 글을 댓글로 올리거나, 해결책으로 투표하기에는 평판이 부족해서 이렇게 올립니다. 다른 사람들도 그것을 사용할 수 있습니다. 그래서 Steeldriver에게 감사를 표하고 싶습니다.

관련 정보