2014-07-16 3 views
3

여러 공백 행을 하나의 공백 행으로 대체하는 sed 스크립트를 작성했지만 예상대로 작동하지 않습니다. 왜 나에게 설명 할 수있는 모두에게 감사 할 것입니다. 작동 예제를 참조하지 마십시오. Google에 익숙합니다. 나는 단지 sed가 어떻게 작동하는지 알고 싶습니다.sed 여러 공백 행을 하나의 공백 행으로 대체

코드는

sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file 

그래서 논리는 간단하다 : 나오지 때 라인을 읽고는 블랭크 또는 여러 줄 바꿈 문자 (이 /^*\n$ 조건이다), 나는 다음 줄을 추가 할 나오지에게있다 패턴 공간. 공백이 아닌 행이 발견되는 즉시 대체 문자 s/^\n\n*/\n/이 완료됩니다.

파일 끝 부분에 빈 줄이있는 경우를 제외하고 모든 것이 잘 작동합니다. 이 공란은 하나의 공란으로 대체되지 않으며 나는 그 이유를 이해하지 못한다.

아이디어가 있으십니까? 같은 결과 만 적은 수의 대체를 위해,

perl -0777 -pe 's/\n+/\n/g' yourfile 

또는 : 당신이 그런데 \n+

를 사용할 수있는 대신 \n\n*

답변

4

다음 줄을 읽는 동안 문제가 sed이되어 EOF이됩니다.

N을 사용하여 다음 줄을 읽을 때 명령이 완료됩니다. 왜냐하면, 다음 줄을 읽는 동안 sedEOF이됩니다. 따라서 s/^\n\n*/\n/ 대체를 처리하지 않습니다. 그래서 파일 끝에 표시된 빈 줄을 제거 할 수 없습니다.

내 솔루션은 다음과 같습니다

sed ':a; /^\n*$/{ s/\n//; N; ba};' yourfile 
1

은이는 펄 한 라이너처럼 보일 것 인 것이다 :

01 :

perl -0777 -pe 's/\n\n+/\n/g' yourfile 

또는, 더 마법, @hwnd 제안이 컴팩트 한 솔루션을 시도

perl -00 -pe '' 
+0

영업 이익은 하나의 빈 줄에 모든 연속 blanklines을 대체하고자합니다. 명령은 모든 공백 행을 제거합니다. –

+0

이것은 문제를 해결하지 못하며,'\ n +'를 사용하면 파일 끝에있는 개행 문자는 무시됩니다. 더하기, OP가 그가 sed로 작업하기를 원했을 때 – Aserre

+0

@ zx81 연속적인 빈 줄을 지우려면'perl -00 -pe ''' – hwnd