vim / sed에서 여러 개의 빈 줄을 하나의 빈 줄로 바꾸기


42

다소간 질문은 모든 것을 말합니다. /^$/d빈 줄이 모두 제거 된다는 것을 알고 있지만 '두 개 이상의 빈 줄을 하나의 빈 줄로 바꾸는 방법'을 볼 수 없습니다.

어떤 아이디어?

답변:


48

vim을 사용하지 않거나 다른 용도로 sed를 사용하지 않는 경우 cat은 실제로 여러 개의 빈 줄을 접는 쉬운 내장 방법을 사용 cat -s합니다.

당신이 정력에 이미 있었고, 거기 체재하고 싶었다면, 당신은 내부 검색이 작업을 수행하고 실행하여 대체 할 수있는 : :%s!\n\n\n\+!^M^M!g합니다 (^ M은 개행 문자의 시각적 표현은, 당신이 타격하여 입력 할 수 있습니다 Ctrl+를 vEnter, 또는 자신에게 저장) 고양이를 겨냥하여 입력 : :%!cat -s.


와우, -s고양이 의 옵션을 몰랐다 -단지 역사적인 메모는 POSIX에는 없지만 BSD와 GNU 고양이에서 사용할 수있는 것 같습니다.
maxschlepzig

2
에 대한 '승리'로 표시 :%!cat -s. 매일 GNnew를 배우십시오!
앤드류 볼스터

3
다음과 같이 ^ M 대신 \ r을 사용할 수도 있다고 생각합니다.%s!\n\n\n\+!\r\r!g
Niko Bellic

오늘이 필요했습니다. 고마워요, 케일럽! :)
Dɑvïd

19

\n검색 패턴에서 줄 바꿈을 나타내는 데 사용하십시오 . 대체 텍스트에 Ctrl+ M를 사용 하거나 역 참조를 사용하십시오. 참조 :help pattern:help sub-replace-special(에서 연결 :help :s).

%s/\(\n\n\)\n\+/\1/

검색 패턴은 어떻게 설명합니까?
Sagar Jain

@sjmp 요구 사항 : 둘 이상의 빈 줄을 단일 빈 줄로 바꿉니다. 구현 : 3 개 이상의 연속적인 개행 문자를 2 개의 개행 문자로 바꿉니다. 명령에 사용 된 구성에 대한 설명은 매뉴얼을 참조하십시오.
Gilles 'SO- 악마 그만'

그러나 왜 내용이 고정되어있을 때 그룹을 사용해야합니까?
Sabuncu

@Sabuncu 그룹을 사용할 필요는 없습니다. 그러나 왜 그룹을 사용하지 않습니까? 대체 텍스트에 줄 바꿈으로 명령을 복사하여 붙여 넣을 수 없기 때문에 그룹을 사용했습니다. 리터럴 Ctrl + M 문자를 삽입해야 \n하며 대체 텍스트에서 작동하지 않습니다.
질 'SO-정지 존재 악마'

이해합니다. 시간을내어 답변 해 주셔서 감사합니다.
Sabuncu

6

Vim에 있다면 다음과 같이하십시오 :

:%!cat -s

2
man페이지 의 인용문 인 경우에도 작동 방식에 대해 약간의 세부 사항을 추가 할 수 있습니다 .
jasonwryan 5

Windows 7에서 작동하지 않았습니다.
user674669

0

펄 사용하기 :

perl -00 -pe ''

-00 명령 행 옵션은 단락 슬러 프 모드를 켭니다. 즉, Perl은 한 줄씩이 아닌 단락별로 텍스트를 읽습니다.


0

sed (GNU sed) 4.2.2 사용시 :

sed -r '
  /^\s*$/ { 
    # blank line
:NEXT
    N # append next line to pattern space - if none, autoprint PS and exit
    s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
  }
  # else, autoprint PS and next/exit
' < $MYFILE

-2

나는 이것이 바보 같은 코드라는 것을 알고 있지만 10 분 안에이 문제를 해결하고 싶었습니다.

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done

1
uniq인접한 동일한 선을 제거합니다. OP가 원하는 것이 아닙니다.
pacholik

@pacholik 그는 분명히 "여러 개의 빈 줄을 하나의 빈 줄로 바꾸는 것"은 인접한 동일한 줄을 제거하지 않는다고 말했습니다.
Mahmoud Zalt

3
네, 정확히 ...
pacholik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.