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 -0
는 perl
전체 파일을 후루룩 마시고, -p
에서 제공한 스크립트를 적용한 후 각 입력 줄을 인쇄하도록 지시합니다 -e
. 스크립트 자체는 58 F
s와 주변 두 줄을 일치시켜 제거합니다.
답변3
sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out
sed
한 줄 미리보기를 얻은 다음 P
시리즈에 맞지 않는 줄을 출력하기 위해 린트만 합니다. 왜냐하면 한 줄 더 점프하고 처음 두 줄과 일치할 때 버퍼를 덤프하기 때문입니다.