입력 파일:
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
하지만 별로 좋지는 않습니다.