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에서는 사용할 수 있지만 grep
POSIX 표준에서는 사용할 수 없습니다.
sed
GNU가 없는 경우 도움이 되는 간단한 솔루션은 다음과 같습니다 grep
.
sed -n '/&/!N;/&/p' your_file
어떻게 작동하나요?
- 이
-n
스위치는 기본 "인쇄" 작업을 억제합니다.sed
/&/!N
의미: 현재 줄에 해당 줄이 없으면&
패턴 공간에 다음 줄을 추가합니다./&/p
의미:&
패턴 공간을 일치시키고 인쇄합니다.
답변2
grep -B1
시뮬레이션하는 방법은 다음과 같습니다 sed
.
sed '$!N;/pattern/P;D' infile
그것은 매우 유사하다여기 하나 있어요. 다른 것과 마찬가지로 N
ext 줄에서 읽히지만 이번에는 P
첫 번째 \n
ewline 에 인쇄됩니다.만약에패턴 공간성냥, 그런 다음 다른 것과 마찬가지로 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