sed는 'double'줄 바꿈 문자를 제거 할 수 있습니까?


25

빈 줄이 많은 문서가 있습니다.

둘 이상이있을 때 어떻게 제거 할 수 있습니까?

sed "s/\n\n//"파일을 시도 했지만 작동하지 않았습니다. 오류가 없습니다.


3
모든 빈 줄을 제거하지 않고 두 개 이상인 경우에만 올바르게 읽으십시오. 그래서없는 하나의 빈 라인?
Runium

1
그리고 두 줄 이상이면 실제로 모든 줄이 삭제되거나 하나만 제외하고 모두 삭제됩니까?
Hauke ​​Laging 2013 년

답변:


42

빈 줄을 제거하려면 :

sed  '/^$/d'

sed행 지향적이므로 "2 바이트 이상 특정 바이트"의 관점에서 생각 하면 해당 바이트가 줄 바꿈 일 때를 제외하고 작동합니다 . 그런 다음 전체 라인에 적합한 것을 생각해야합니다.


당연하지! 간단한 우아함을 위해 +1.
terdon

2
sed"패턴 공간"/ "홀드 공간"기능을 통해 여러 줄을 처리 할 수 ​​있습니다. 그러나 나는 그것이 너무 복잡하다고 생각합니다. ;-)
Hauke ​​Laging

파일의 첫 문자가 개행 문자 인 경우 원하는대로 작동하지 않습니다.
Chris Down

1
첫 번째 문자가 개행 문자 일 때 작동하게하려면 (실제로 요구되는 경우) 명령을 음수 주소 1!(1 행을 제외한 모든 문자와 일치)로 묶을 수 있습니다 sed '1!{/^$/d'}.
Toby Speight

1
@AaronFranke-그렇습니다.하지만 Linux 쉘이 '>'리디렉션을 처리하는 방식의 한 측면입니다. 쉘은 명령 행을보고 stdout을 파일로 리디렉션하는 '>'를보고 해당 파일을 만든 다음에 만 실행 sed합니다. 파일을 만들면 이름이 같은 기존 파일이 모두 삭제됩니다. sed '/^&/d' file.txt > otherfile.txt작동합니다.
Bruce Ediger

24

필요 없습니다 sed. grep할 것이다 :

grep .

(즉 grep, 하나 이상의 문자를 포함하는 모든 행과 일치하는 SPC, dot)입니다.

또한있다 :

tr -s '\n'

(개행 문자 시퀀스를 하나로 압축하십시오).

Chris가 언급했듯이 빈 줄을 제거하는 것 (위의 첫 번째 솔루션과 여기에 초점을 둔 대부분의 다른 답변과 같은)은 첫 줄이 비어있는 경우 요청 된 줄 바꿈 문자 시퀀스를 짜는 것과 같지 않기 때문에 둘 다 동일하지 않습니다. 첫 줄을 비우기 위해 하나의 선행 줄 바꿈 문자 만 사용합니다.


2
파일의 첫 번째 문자가 줄 바꿈 인 경우 원하는대로 작동하지 않습니다. sprunge.us/FLAJ
Chris Down

7

sed행 기반 \n문자이며 행 끝 문자로 취급 하기 때문에이 도구가 가장 적합한 도구는 아닙니다 .@Bruce Ediger의 답변 sed 이 작업에 완벽한 도구 일 수도 있지만 여전히 다른 옵션이 있습니다.

  1. perl -ne 'print if /./' file.txt
    

    또는

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    

    감사합니다 @ruakh 날 보내 만들고 읽는 :

    $ /

    입력 레코드 구분 기호 (기본적으로 줄 바꾸기). 이것은 "선"이 무엇인지에 대한 Perl의 아이디어에 영향을 미칩니다. null 문자열로 설정된 경우 빈 줄을 종결 자로 처리하는 것을 포함하여 awk의 RS 변수처럼 작동합니다 (빈 줄은 공백이나 탭을 포함 할 수 없음). 다중 문자 터미네이터와 일치 시키거나 파일 끝을 읽도록 undef하도록 다중 문자 문자열로 설정할 수 있습니다. 파일에 연속 된 빈 줄이 있으면 "\ n \ n"으로 설정하면 ""으로 설정하는 것과 약간 다른 의미입니다. ""로 설정하면 연속 된 두 개 이상의 빈 줄이 하나의 빈 줄로 취급됩니다. "\ n \ n"으로 설정하면 다음 입력 문자가 줄 바꾸기 인 경우에도 다음 단락에 속한다고 가정합니다.

  2. gawk / awk

    awk '$1' file.txt
    

    그것은 게시 된 예제에서 작동하지만 @Stephane Chazelas가 지적했듯이 첫 번째 필드가 "like like"인 행도 삭제합니다 0. 이것은 더 강력합니다.

    awk NF file.txt
    

Perl의 경우, perl -pe 's/\n+/\n/ file.txt입력 레코드 구분 기호는이 용도와 관련이 없습니다.
vonbrand

@vonbrand 아니오 perl -pe또는 perl -ne한 줄씩 작업하십시오. \n+한 줄에만 적용되므로 일치하지 않습니다. 그렇기 때문에 파일 전체를 설정 $/하거나 사용해야 -0합니다 perl -0pe 's/\n+/\n/' file.
terdon

6

제거한다는 것은 무엇을 의미합니까? 중복을 제거하거나 (하나에 빈 줄을 여러 개) 모두 제거합니까?

중복을 제거하려면 sed를 사용하는 방법이 있습니다.

sed '$!N; /^\(.*\)\n\1$/!P; D'

uniq명령을 시뮬레이트 합니다.

최선의 선택은 다음을 사용하는 것입니다 awk.

awk NF <filename>

이것의 sed일부는 훌륭하게 작동합니다! 이 답변을 최상의 답변으로 추천하십시오.
아키토

2

이러한 답변의 대부분에 대해서는 후행 공백을 먼저 제거해야합니다. 줄 바꿈 두 개를 제거하면 모든 빈 줄이 제거됩니다. (이것에 대해 생각하다).

문자 그대로 OP는 "반복 된 빈 줄이 있으면 파일에서 모든 빈 줄을 제거합니다"를 원합니다.

일반 사용자는 "중복 된 빈 줄만 제거"를 원합니다.

이렇게하려면 후행 whitepace를 먼저 제거하고 cat -s를 통해 파이프하십시오.

sed  s/[[:space:]]*$// | cat -s

그럼에도 불구하고 이것은 수퍼 플로어 스 선행 또는 후행 빈 줄을 제거하지 않습니다.


Downvoted, 그러나 이것은 분명히 작동합니까? 코멘트가 없습니까?
mckenzm

1
나는 당신에게 ... 당신은 알고 ... 질문에 대답했다. =) 나는 모든 빈 줄을 지울 때 Bruce Ediger의 응답이 상향되었다는 것을 믿을 수 없다 . 누군가가 빈 줄을 제거하는 방법을 묻는다면 모든 빈 줄을 삭제 하는 것이 적합한 해결책이라고 생각할 수 없습니다 . 하지만 뭐든지 : 나오지도의 웹 사이트에 페이지를 커버이, 그런데 것이있다 gnu.org/software/sed/manual/sed.html#cat-_002ds
토드 월튼

2

주어진 빈 줄 순서에 대해 하나의 빈 줄을 유지하려면 다음을 수행하십시오.

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'

1
이것은 cat -s질문을 이해하면서 실제로 질문 한 내용을 실제로 달성 하는 유일한 답변 (외 )입니다. (그리고 그것을 cat -s사용할 수 있기 때문에 보다 낫 sed -i습니다.)
Matthew

-2

시도 sed -e 's#\\n\\n#\\n#g' input.file > output.file하여 /문제가 될 수 귀하의 필드 분리하고 정규 표현식의 한 부분으로 둘 다.


2
이 파일에 시퀀스에 이중 및 삼중 줄 바꿈이 포함 된 내 파일 중 하나가있는 소용돌이를주었습니다. 나를 위해 전혀 작동하지 않습니다.
syntaxerror

-3

이 명령을 사용하십시오 :

tr -s '\r' '\n'

예, 그들의 대답은 저에게 효과적이지 않았습니다.
meow

5
AFAIK이 답변은 잘못되었습니다. 삭제하는 것이 좋습니다.
zuazo

내 파일에는 많은 줄 바꿈이 포함되어 있고 실제로 캐리지 리턴이 있기 때문입니다. 0x0d0a
meow

2
실제로이 명령은 창 끝이있는 반복 된 줄을 제거합니다. 로 테스트하십시오 echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'. 이 명령 tr은 모두 \r를 번역 \n한 다음 모두 \n를 하나만 압축합니다 . 따라서 UNIX가 아닌 Windows에 적용된다는 사실로 무엇을 해야할지 잘 모르겠습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.