일치 후 x 줄 삭제

일치 후 x 줄 삭제

sed일치 후 두 번째 줄(또는 임의의 숫자)을 삭제하지만 일치 항목과 그 사이의 줄은 포함하지 않고 삭제하려면 어떻게 해야 합니까 ?

예를 들어:

Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
> mysecretword
Password accepted

"아래 프롬프트에 비밀번호를 입력하세요" 줄 뒤에 두 줄이 있기 때문에 "> mysecretword" 줄만 삭제하고 싶습니다. 일치 항목이 파일 시작 후 여러 줄에 나타날 수 있기 때문에 절대 줄 번호 위치를 사용할 수 없습니다.

온라인으로 검색하면 와 같은 많은 솔루션을 찾을 수 있지만 sed '/Enter your password.*/,+3d' filex이렇게 하면 "비밀번호 입력..." 줄과 다음 줄도 제거되는데 이는 내가 원하는 것이 아닙니다. 일치 후 특정 수의 줄인 한 줄만 제거하고 싶습니다.

sed(또는 일반적으로 사용 가능한 다른 도구)를 사용하여 이 작업을 어떻게 수행할 수 있습니까 ?

답변1

아마도

sed '/^Enter your password/ {
n
n
d
}' file

또는 동등하게:

$ sed '/^Enter your password/ {n;n;d;}' file
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted

답변2

일반적인 경우에는 Ed Morton의 훌륭한 답변을 참조하세요.일치하는 패턴을 따르는 줄을 sed 또는 awk로 인쇄하기 .

d) 일부 정규식 다음에 N번째 레코드를 제외한 모든 레코드를 인쇄합니다.

awk 'c&&!--c{next}/regexp/{c=N}1' file

주어진 입력을 적용하는 중

$ awk 'c && !--c{next} /^Enter your password/{c=2} 1' ip.txt 
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
  • /^Enter your password/{c=2} 1입력 레코드를 인쇄하기 위해 c무시할 일치 항목 뒤의 n번째 줄은 다음과 같습니다 .1
  • c && !--c{next}단락 &&연산자이므로 cfalse로 평가되는 한 c감소하지 않습니다. 값으로 설정된 후에는 c해당 값에 도달하지 않는 한 감소됩니다.0

답변3

sed '/Enter your password.*/{N;p;N;d;}' file

관련 정보