입력.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
원하는 출력:
8B0F
8AC0
8AE4
8AE5
해당 줄이나 다음 줄에 "삭제"가 포함되어 있지 않으면 해당 줄을 인쇄하고 싶습니다. 저는 Solaris 5.10, KSH를 사용하고 있습니다.
답변1
그리고 sed
:
sed '$!N;/remove/!P;D' infile
그러면 N
ext 라인이 패턴 공간으로 당겨지고( !
lat $
라인이 아닌 경우) 패턴 공간이 일치하는지 확인합니다 remove
. 존재하지 않는 경우(패턴 공간의 어느 라인에도 string 이 포함되어 있지 않음을 의미 ) 첫 번째 ewline 문자로 인쇄 remove
됩니다 (즉, 첫 번째 라인을 인쇄합니다). 그런 다음 첫 번째 줄 바꾸기 문자를 삭제하고 루프를 다시 시작합니다. 이런 식으로 패턴 공간에는 두 개 이상의 줄이 없습니다.P
\n
D
\n
루프 앞뒤에 다음을 추가하여 패턴 공간을 살펴보면 이해하기 더 쉬울 수 있습니다 N
.P
D
l
N
sed 'l;$!N;l;/remove/!P;D' infile
따라서 예제의 마지막 6줄을 사용하세요.
8AC3
remove
8AE4
8AE5
8AE6
remove
마지막 명령 출력:
8AC3$ 8AC3\n $ 삭제 $ 삭제 삭제\n 8AE4$ 8AE4$ 8AE4\n 8AE5$ 8AE4 8AE5$ 8AE5\n 8AE6$ 8AE5 8AE6$ 8AE6\n $ 삭제 $ 삭제 $ 삭제
간단한 설명은 다음과 같습니다.
cmd 출력 cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)
답변2
awk '
!/remove/ && NR > 1 && prev !~ /remove/ {print prev}
{prev = $0}
END {if (!/remove/) print}
' Input.txt
답변3
gawk 'BEGIN{ RS="remove\n"; ORS="" }
RT{ print gensub("[^\n]*\n$","","") }; !RT{ print }' file
위의 방법은 레코드를 읽지 않습니다.한 줄씩, 대신에 다음과 같이 읽습니다.여러 줄하나의 레코드 구분 기호(RS)에서 다음(또는 파일 끝)까지의 레코드는 RS
행 자체(후행 `\n 포함)를 "삭제"하는 것입니다.
!RT
마지막 행이 행이 아닌 경우 테스트해야 합니다 RS
.
RT
,ㅏ바보주의는 현재 레코드의 실제 텍스트입니다 RS
.
gensub
또한바보주의.
표시된 선을 확인해야 하는 경우성냥한 줄이 아닌 한 줄의 어느 곳에서나 "삭제"동일한"삭제"한 다음 레코드 구분 기호를 다음과 같이 변경하십시오.
`RS="[^\n]*remove[^\n]*\n"`
산출:
8B0F
8AC0
8AE4
8AE5