2016-09-27 3 views
1

이후에 두 줄을 삭제합니다. 저는 배시를 처음 접했고 파일에서 문자열을 찾고이 발견 된 문자열에서 시작하는 두 줄을 삭제하는 방법을 알고 싶습니다.파일에서 문자열을 찾고

내 파일과 같은 포맷 :

username 
pass 
username2 
pass2 
username3 
pass3 

그리고 예를 들어 하나의 특정 사용자 삭제하려면 :

./deleteftpuser username2 

을 그리고

username 
pass 
username3 
pass3 

I과 같은 파일이 내가 sed 명령을 사용해야한다고 생각하지만 어떻게 사용해야하는지 모르겠다.

도움을 주셔서 감사합니다.

sed '/username2/ {N; d}' file.txt 

awk 함께 : GNU sed 함께

답변

1

awk '/username2/ {np=1; next}; !np {print} np {np=0}' file.txt 

예 :

% cat file.txt 
username 
pass 
username2 
pass2 
username3 
pass3 

% sed '/username2/ {N; d}' file.txt 
username 
pass 
username3 
pass3 

% awk '/username2/ {np=1; next}; !np {print} np {np=0}' file.txt 
username 
pass 
username3 
pass3 
+0

가 왜'/.*/'하고 있습니다 : $0 또는 pusername2하고 next가 그 경우에 발생하는 경우 p에만 설정되어 있습니까? '/ username2/{N; d}'이면 충분합니다. – 123

+0

@ 123 절대적으로, 내가 생각하고있는 것을 알지 못했습니다 :/ – heemayl

+0

awk 솔루션은'awk '/ username2/||로 단축 될 수 있습니다. f {f =!에프; } – Sundeep

0
sed -e '/username2/ { N; d; }' infile 
username 
pass 
username3 
pass3 
+0

이 코드는 문제를 해결하는 데 도움이 될 수 있지만 _why_ 및/또는 _how_는 질문에 대답하지 않습니다. 이러한 추가적인 맥락을 제공하면 장기적인 교육적 가치가 크게 향상 될 것입니다. 어떤 제한 사항 및 가정이 적용되는지를 포함하여 설명을 추가하기 위해 답을 [편집하십시오]. –

0

GNU sed

$ cat ip.txt 
username 
pass 
username2 
pass2 
username3 
pass3 

$ sed '/username2/,+1d' ip.txt 
username 
pass 
username3 
pass3 

으로이 username2 일치하는 라인을 검색 한 후 그 라인을 더한 후 한 줄을 삭제합니다. 필요에 따라 라인이 지정된 패턴과 일치하는 경우 perl

$ perl -ne 'if(/username2/){ $l = <> foreach(1..1) } else{ print }' ip.txt 
username 
pass 
username3 
pass3 

$ perl -ne 'if(/username2/){ $l = <> foreach(1..2) } else{ print }' ip.txt 
username 
pass 
pass3 

$ # can also use: perl -pe 'if(/username2/){ undef $_; <> foreach(1..2) }' ip.txt 
  • 와 후 등

    일반 솔루션에 두 줄을 삭제 +2로 변경, 그 후 라인을 얻을.

  • 그렇지 않으면, 인쇄 입력 라인은
0

그렙은

$cat file 

username 
pass 
username2 
pass2 
username3 
pass3 

grep -A 1 "username2" file > temp 
grep -vf temp file 

스토어 검색 문자열 및 파일 temp에 후 한 줄 솔루션 -. 그런 다음 파일에서 다른 모든 항목을 가져옵니다.

출력 -

username 
pass 
username3 
pass3 
0

또 다른 AWK 솔루션입니다.

$ awk '($0=="username2" || p=="username2") && p=$0 {next} 1' file 
username 
pass 
username3 
pass3 
관련 문제