어떤 명령이라도 사용하여 다음 결과를 얻을 수 있기를 바랍니다. 명확성을 위해 편집되었습니다. 한 줄이 아닌 ^xyz 앞에 있는 모든 ^abc를 삭제하려고 합니다.
표준 출력:
abc def
abc ghi
abc jkl
xyz mno
xyz pqr
abc def
abc ghi
abc jkl
xyz mno
xyz pqr
원하는 결과:
abc jkl
xyz mno
xyz pqr
abc jkl
xyz mno
xyz pqr
답변1
루프를 사용하여 두 줄 버퍼를 유지 N
D
하고 삭제하기 전에 첫 번째 줄을 인쇄할 수 있습니다( xyz
버퍼에 있는 경우에만).
$ cat stdout | sed ':a; $!N; /xyz/P; D; ba'
abc jkl
xyz mno
xyz pqr
abc jkl
xyz mno
xyz pqr
답변2
이것은 awk
하나의 라이너입니다.
awk '/^abc/ {prev = $0; prevabc = "true"}; /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}' file.txt
설명하다
/^abc/ {prev = $0; prevabc = "true"};
: 행이 로 시작하면 인쇄하는 대신 해당 행의 값을 변수에 저장하고abc
변수에 저장하여prev
행이 로 시작함을 나타냅니다 .abc
true
prevabc
/^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}
: 줄이 로 시작하는 경우xyz
다음을 수행합니다.if (prevabc == "true") {print prev; prevabc = "false" }
: 이전 줄이abc
(becauseprevabc == "true"
)로 시작하면 이전 줄을 인쇄prev
하고prevabc
로 재설정합니다false
.print
: 이 줄은 로 시작하므로xyz
이 줄도 인쇄하세요.