sed를 사용하여 첫 번째 줄 다음에 일치하는 패턴이 있는 줄을 삭제합니다.

sed를 사용하여 첫 번째 줄 다음에 일치하는 패턴이 있는 줄을 삭제합니다.

첫 번째 줄(패턴은 ) 뒤에 패턴이 포함된 모든 줄을 삭제하고 싶습니다 /^country\t/. 삭제할 수 있어요모든와 함께 발생 sed '/^country\t/d' in.txt > out.txt하지만 첫 번째 발생을 첫 번째 줄에 유지하고 싶습니다.

뒷이야기는 헤더가 있는 탭으로 구분된 파일 디렉터리가 있고 이러한 파일을 cat. 추가 헤더를 제거하고 싶습니다.

Vim에서는 다음과 같은 작업을 수행할 수 있지만 : 2,$g/^country\t/dsed 솔루션을 찾을 수 없습니다. 시도하면 sed '2,$ /^country\t/d in.txt > out.txt오류가 발생합니다 unknown command: /.

감사해요!

답변1

직접적인 방법은 없지만 해결 방법은 다음과 같습니다.

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

답변2

이것은 당신에게 도움이 될 수 있습니다:

sed '1b;/^country\t/d' in.txt > out.txt

또는

sed '1!{/^country\t/d}' in.txt > out.txt

답변3

sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

첫 번째 일치하는 줄 이후에 일치하는 모든 줄이 삭제됩니다. 해설:

/무늬/- 일치 패턴

{엑스- 위와 일치하면 패턴을 교환하고 버퍼를 유지합니다.

;/패턴/!{x;h;b;}- 이제 패턴 버퍼를 테스트하고(이제 첫 번째 일치에서는 비어 있음) 그렇지 않은 경우! 이미 패턴이 포함되어 있으면 패턴을 'x' 교체하고 버퍼를 다시 다시 저장한 다음 패턴 버퍼를 홀드 버퍼 'h'에 복사하고 'b'를 스크립트 끝으로 분기하고 다음 줄을 로드합니다.

;x;d}- 이 비트는 이전 단계에서 부정된 패턴 일치가 실패한 경우에만 실행됩니다. 즉, 패턴 버퍼가 패턴과 일치합니다. 이 경우 홀드 및 패턴 버퍼를 다시 'x'로 바꾸고 해당 라인을 'd' 삭제합니다.

답변4

/pattern/이 빈 줄과 일치하지 않으면 "공간은 hold빈 줄로 초기화됩니다"를 사용하여 첫 번째 일치 항목을 테스트합니다.

첫 번째 줄을 유지하십시오.

sed '/pattern/ {x; /^$/!d; g;}' file

첫 번째 줄을 삭제하십시오.

sed '/pattern/ x' file

첫 번째 줄만 편집하세요.

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

다음 줄만 편집하세요.

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

추신: $'\n'(a 아님 )은 or 를 ;따르 므로 bsd sed를 행복하게 만듭니다.tb

관련 정보