연속된 개행 문자를 제거하려면 ed를 사용하세요.

연속된 개행 문자를 제거하려면 ed를 사용하세요.

입력 파일:

1 line1\
2 line2\
3 line3\
4 \
5 line4\
6 \
7 \
8 line5\

원하는 출력:

1 line1
2 line2
3 line3
4
5 line4
6
7 line5

POSIX는 괜찮나요 ed?

후행 백슬래시를 제거하는 것은 쉽지만 예상되는 출력으로 연속된 검은색 슬래시를 어떻게 처리할 수 있습니까?

답변1

이를 통해 sed다음을 수행할 수 있습니다.

sed 's/\\$//;/./,/^$/!d'

(다른 시대의 구문 외에도) 주요 문제 중 하나 ed는 스크립트의 오류 처리입니다.

ed기본적으로 파일 편집에 성공했다면 성공을 반환한 것으로 처리해야 합니다. 그러나 성공적인 편집을 위해서는 모든 명령 주소를 유효하게 만들고 모든 명령이 성공해야 합니다. 예를 들어 명령의 경우 s이는 최소한 하나의 대체가 완료되었음을 의미합니다.

따라서 이 경우 편집이 성공했는지 확인하려면 까다로울 수 있습니다.

@Sukminder의 솔루션을 기반으로 특수 사례를 다루려면 다음과 같이 작성할 수 있습니다.

printf '%s\n' a a . 'g/\\$/s///' ',s/^/a/' 'g/^a$/+1,/./s/^a$//' \
  'v/./d' 'g/^a/s///' '$d' w | ed -s the-file

g파일이 비어 있으면 명령이 실패합니다(기본 주소 범위( )가 유효하지 않기 때문에 먼저 명령 을 1,$사용하여 파일 끝에 줄을 추가해야 합니다 a. 다음과 같은 줄( )이 있을 때만 실행하면 됩니다 .,s/\\$//\g/\\$/s///

여기서는 "xx"를 삽입하는 대신(입력에서 찾을 수 없다고 가정) 각 줄 앞에 "a"를 추가하고 삭제할 줄을 나중에 삭제되는 빈 줄로 바꿉니다.

ed파일에 쓸 수 없는 경우(명령 실패) 스크립트가 0이 아닌 종료 상태만 반환하기를 바랍니다 . 불행하게도 FS가 가득 찼을 때 파일을 쓸 수 없을 때 일부 구현이 성공을 반환하는 것을 w보았습니다 .ed

IMO는 ed피하는 것이 가장 좋습니다. 오늘날에는 perl -pi.back더 휴대성이 좋고 안정적으로 사용할 수 있습니다.

답변2

한 번에 이 작업을 수행하는 방법을 잘 모르겠습니다. 다만, 내용이 잘 알려진 경우에는 이중 행에 고유한 문자열을 추가할 수 있습니다.

# Add XX to lines that should be deleted
g/^$/+1s/^$/XX/
# Delete them
g/XX/d

하지만 별로 좋지는 않습니다.

관련 정보