Ed에서 두 개 이상의 빈 줄을 하나의 빈 줄로 바꾸는 방법은 무엇입니까?

Ed에서 두 개 이상의 빈 줄을 하나의 빈 줄로 바꾸는 방법은 무엇입니까?

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: join 명령은 선택한 줄( .)부터 위의 비어 있지 않은 다음 줄( )까지 의 줄에 적용됩니다 /./-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먼저 작업을 저장 해야 합니다 . uniqe !somecommand명령은 편집 버퍼의 내용을 의 출력으로 대체 somecommand하고 uniq지정된 파일에서 반복되는 연속 라인을 제거합니다. 명령에서 %현재 파일의 이름으로 대체됩니다. 초기 가정을 기반으로 반복되는 연속 빈 줄을 제거하여 문제를 해결합니다.

관련 정보