패턴을 일치시키는 방법, Solaris 10에서 패턴과 다음 및 이전 줄을 삭제하는 방법

패턴을 일치시키는 방법, Solaris 10에서 패턴과 다음 및 이전 줄을 삭제하는 방법

Solaris 10에서 패턴을 일치시키고 패턴과 다음 및 이전 줄을 삭제하려면 어떻게 해야 합니까? Solaris에는 GNU sed가 제공되지 않기 때문에 난감한 상황입니다. 다음 파일 내용을 고려하면:

    LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

다음을 포함하는 블록을 제거하고 싶습니다.

    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }

파일은 다음과 같습니다:

LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

다음 줄을 삭제하려면 다음을 실행했습니다.

sed -e '/LinearRec(1\,\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/{n;d;}' file.txt

일치하는 줄과 이전 줄은 어떻습니까?

어쩌면 ed나 vi를 사용하여 달성할 수 있을까요? 고마워!

답변1

스크립트 는 다음과 같습니다 ed.

ed <<\!
e file.txt
/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-1,+1d
w newfile.txt
!

출력을 file 에 씁니다 newfile.txt.


이것의 "전역" 반복 버전은 다음과 같습니다.

ed <<\!
e file.txt
g/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/-1,+1d
w newfile.txt
!

답변2

접근 perl방식(파일이 메모리에 로드될 만큼 작다고 가정):

perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file

make -0perl전체 파일을 후루룩 마시고, -p에서 제공한 스크립트를 적용한 후 각 입력 줄을 인쇄하도록 지시합니다 -e. 스크립트 자체는 58 Fs와 주변 두 줄을 일치시켜 제거합니다.

답변3

sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out

sed한 줄 미리보기를 얻은 다음 P시리즈에 맞지 않는 줄을 출력하기 위해 린트만 합니다. 왜냐하면 한 줄 더 점프하고 처음 두 줄과 일치할 때 버퍼를 덤프하기 때문입니다.

관련 정보