위의 항목이 아닌 일치 항목 앞에 오는 행을 표준 출력에서 ​​제거합니다.

위의 항목이 아닌 일치 항목 앞에 오는 행을 표준 출력에서 ​​제거합니다.

어떤 명령이라도 사용하여 다음 결과를 얻을 수 있기를 바랍니다. 명확성을 위해 편집되었습니다. 한 줄이 아닌 ^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행이 로 시작함을 나타냅니다 .abctrueprevabc
  • /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}: 줄이 로 시작하는 경우 xyz다음을 수행합니다.
    • if (prevabc == "true") {print prev; prevabc = "false" }: 이전 줄이 abc(because prevabc == "true")로 시작하면 이전 줄을 인쇄 prev하고 prevabc로 재설정합니다 false.
    • print: 이 줄은 로 시작하므로 xyz이 줄도 인쇄하세요.

관련 정보