기본 awk 또는 sed를 사용하여 두 패턴 사이의 모든 줄을 삭제하고 싶습니다.
foo.txt
:
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
--------------------------------------------------- Cap in MB
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
--------------------------------------------------- Cap in MB
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
--------------------------------------------------- Cap in MB
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
output.txt
:
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
저는 Solaris 5.10을 사용하고 있으며 기본 awk 및 sed만 사용하고 있습니다. 스레드 수는 2가지 패턴에 따라 다를 수 있습니다. 첫 번째 문자열이 아니라 두 번째 문자열을 바꿔야 합니다. 두 모드의 차이점은 대시 수에 있습니다. 당신이 보는 것은 foo.txt
내 실제 파일입니다.
답변1
$ awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
어떻게 작동하나요?
스크립트에는 변수가 있습니다 f
. true(1) 인 경우 f
삭제할 행 범위 내에 있는 것입니다. false(0)이면 인쇄되어야 하는 범위에 있는 것입니다.
기본적으로 f
프로그램이 시작되면 이는 false입니다.
!f{print}
f
false이면 모든 줄을 인쇄합니다./----------------------/{f=!f;if (!f)print "Deleted up to this point"}
점선으로 표시된 구분선에 도달하면 값이 반전됩니다
f
. f가 이제 false이면 "삭제됨" 메시지를 인쇄합니다.
고쳐 쓰다
Solaris의 기본 awk에 문제가 있는 것 같습니다. 노력하다:
nawk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt
또는,
/usr/xpg4/bin/awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt
또는,
/usr/xpg6/bin/awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt
수정된 질문에 답하세요
$ awk ' /^--------------------------------------------------- Cap in MB/{print "Deleted up to this point"; f=0; z=""; next;} /^---------------------------------------------------------------------- Cap in MB/{f=1; if(z)print substr(z,2); z=""; print;next;} f{z=z"\n"$0;next;} END{print substr(z,2);}' foo.txt
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
Deleted up to this point
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
---------------------------------------------------------------------- Cap in MB
line 2
line 3
line 4
line 5
답변2
awk의 간단한 해결책은 다음과 같습니다. 긴 대시 후에 인쇄를 끄고 짧은 대시 후에 인쇄를 켜십시오.
awk '
!do_not_print {print}
$0 == "---------------------------------------------------------------------- Cap in MB" {do_not_print = 1}
$0 == "--------------------------------------------------- Cap in MB" {do_not_print = 0}
' <foo.txt >output.txt
답변3
내 의견은. John1024와 유사하지만 내용이 한 줄에 있으므로 읽을 수 없습니다.
Solaris 8 시스템에서 테스트되었습니다.
/usr/xpg4/bin/awk \
-v section_start='^---------------------------------------------------------------------- Cap in MB' \
-v delete_marker='^--------------------------------------------------- Cap in MB' \
'
$0 ~ section_start {
for (i=1; i<=n; i++)
print line[i]
n=0
delete line
print
next
}
{line[++n] = $0}
$0 ~ delete_marker {
n=1
delete line
line[1] = "Deleted up to this point"
}
END {for (i=1; i<=n; i++) print line[i]}
' foo.txt