grep은 이전 줄과 일치 항목과 일치합니다.

grep은 이전 줄과 일치 항목과 일치합니다.
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

위 줄에서 내가 원하는 것은 grep// sed( awk모든 메소드가 가능함) 서명된 &줄과 위의 줄입니다. 예를 들어 원하는 출력은 다음과 같습니다.

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

내가 운없이 시도한 것은 다음과 같습니다.

egrep "&" | -b 1 file.txt

답변1

넌 할 수있어:

grep -B 1 '&$' your_file

그러면 다음으로 끝나는 줄을 찾아 &삭제하여 그 안의 어느 곳에서나 줄을 $일치시킵니다 &.

-B스위치는 grep일치하는 줄 앞에 "컨텍스트" 줄을 출력하도록 지시합니다. 이 경우 컨텍스트 라인이 필요하므로 가 필요합니다 -B 1.

이 스위치는 GNU에서는 사용할 수 있지만 grepPOSIX 표준에서는 사용할 수 없습니다.

sedGNU가 없는 경우 도움이 되는 간단한 솔루션은 다음과 같습니다 grep.

sed -n '/&/!N;/&/p' your_file

어떻게 작동하나요?

  • -n스위치는 기본 "인쇄" 작업을 억제합니다.sed
  • /&/!N의미: 현재 줄에 해당 줄이 없으면 &패턴 공간에 다음 줄을 추가합니다.
  • /&/p의미: &패턴 공간을 일치시키고 인쇄합니다.

답변2

grep -B1시뮬레이션하는 방법은 다음과 같습니다 sed.

sed '$!N;/pattern/P;D' infile

그것은 매우 유사하다여기 하나 있어요. 다른 것과 마찬가지로 Next 줄에서 읽히지만 이번에는 P첫 번째 \newline 에 인쇄됩니다.만약에패턴 공간성냥, 그런 다음 다른 것과 마찬가지로 D첫 번째 \n줄을 삭제하고 루프를 다시 시작합니다. 따라서 귀하의 입력 예를 바탕으로 다음을 수행하십시오.

sed '$!N;/&/P;D' infile

산출:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

다시 한번, 어떻게 작동하는지 보려면 패턴 공간을 보기 위해 l전후를 추가하세요.N

sed 'l;$!N;l;/&/P;D' infile

예를 들어 샘플 파일의 경우:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

다음은 실행된 명령 sed과 해당 출력입니다.

cmd 출력 cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n

관련 정보