Ed에서는 다음과 같이 모든 빈 줄을 바꾸는 검색을 수행할 수 있습니다.
g/^$/d
그러면 모든 빈 줄이 제거됩니다. 하지만 두 개 이상의 빈 행을 제거하고 1을 유지하려면 어떻게 해야 할까요? 예를 들어:
Line 1
Line 2
Line 3
이 되다:
Line 1
Line 2
Line 3
답변1
에서 적응빔 위키:
ed -s file <<EOF
v/./.,/./-1j
w
q
EOF
v/./
: 정규식과 일치하지 않는 모든 줄을 선택합니다.
(예: 모든 빈 줄 선택). 그들과 함께 다음을 수행하십시오..,/./-1j
:j
oin 명령은 선택한 줄(.
)부터 위의 비어 있지 않은 다음 줄( )까지 의 줄에 적용됩니다/./-1
.
w q
: 저장 및 종료. 이를 사용하면%p Q
파일을 수정하지 않고 출력만 표시할 수 있습니다.
똑같이 유효하지만 원래 제안은 더 복잡했습니다.
printf '%s\n' 'g/^$/.,/./-1d\' 'i\' '' w q | ed -s file
이 명령은 두 개의 명령을 사용하여 단일 g
전역 명령을 나타냅니다(일반적으로 명령 목록은 단일 명령으로 구성됨). 명령 목록에서 개행 앞에 백슬래시를 붙여야 합니다.
g/^$/
: 빈 줄을 모두 선택합니다..,/./-1d\
:d
선택한 행( )에서.
비어 있지 않은 다음 행( ) 위의 행을 삭제합니다/./-1
. 이렇게 하면 빈 줄이 모두 제거되므로'i\' ''
:i
위에 새로운 빈 줄을 삽입합니다.
사용하는 것과 동일여기 문서또는 Ed에게 먹이를주기 위해 Printf를 사용하십시오. 가장 좋아하는 것을 선택하십시오.
인용하다:POSIX 버전.
답변2
외부 명령을 사용하는 것은 완벽하게 유효한 편집 방법이며 ed
, 비어 있지 않은 모든 줄이 주변 줄과 비교하여 고유하다고 가정(예: 중복되지 않음)하여 uniq
과도한 빈 줄을 제거하도록 호출할 수 있습니다.
w
e !uniq %
작업 내용은 디스크의 현재 파일에서 읽혀지므로 w
먼저 작업을 저장 해야 합니다 . uniq
이 e !somecommand
명령은 편집 버퍼의 내용을 의 출력으로 대체 somecommand
하고 uniq
지정된 파일에서 반복되는 연속 라인을 제거합니다. 명령에서 %
현재 파일의 이름으로 대체됩니다. 초기 가정을 기반으로 반복되는 연속 빈 줄을 제거하여 문제를 해결합니다.