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
!
출력을 파일에 기록합니다 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
전체 파일을 -0
후루룩 소리나게 만들고 주어진 스크립트를 적용한 후 각 입력 줄을 인쇄하도록 지시합니다 . 스크립트 자체는 58 과 주변 두 줄을 일치시켜 제거합니다.perl
-p
-e
F
답변3
sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out
sed
단일 라인 미리보기를 수행 한 다음 P
시리즈에 맞지 않는 라인을 출력합니다. 처음 두 라인과 일치하면 다시 점프하여 버퍼를 덤프하기 때문입니다.