일치 후 행 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무시되고 1입력 레코드를 인쇄하는 데 사용되는 일치 항목 다음의 n번째 줄입니다.
  • c && !--c{next}는 단락 연산자이므로 false로 평가되는 &&한 감소하지 않습니다. 값으로 설정된 후에는 해당 값에 도달하지 않는 한 감소됩니다.ccc0

답변3

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

관련 정보