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로 평가되는&&
한 감소하지 않습니다. 값으로 설정된 후에는 해당 값에 도달하지 않는 한 감소됩니다.c
c
c
0
답변3
sed '/Enter your password.*/{N;p;N;d;}' file