Sed는 조건부로 EOL을 삭제합니다.

Sed는 조건부로 EOL을 삭제합니다.

끝에 "\"가 있는 다음 예에서는 \ 및 EOL 문자를 제거해야 합니다.

line 1\
line 2
line 3
line 4\
line 5

출력은

line 1 line 2
line 3
line 4 line 5

vi를 사용하면 다음과 같이 위의 내용을 얻을 수 있습니다.:%s/\//n//g

하지만 터미널에서 이 작업을 수행하면 작동하지 않습니다. 어떤 제안이 있으십니까?

답변1

흠... 제가 시도한 어떤 Vi 편집기에서도 Vi 교체가 작동하지 않습니다. 아마도 :%s/\\\n/ /gVim에서는 작동하지만 Vi에서는 작동하지 않는다는 의미일 것입니다 .


$ sed '/\\$/{N;s/\\\n/ /;}' file
line 1 line 2
line 3
line 4 line 5

이는 현재 줄이 백슬래시로 끝나는지 여부를 감지하고, 그렇다면 다음 줄을 추가하고( sed그 사이에 개행 문자가 추가됨) 백슬래시와 개행 문자를 공백 문자로 바꿉니다.

연속된 두 줄 끝에 백슬래시가 있으면 실패합니다. 이렇게 하려면 다음과 같은 것을 사용하십시오.

sed ':top;/\\$/{N;s/\\\n/ /;btop;}' file

여기서 백슬래시가 있는 줄이 처리되면 코드는 처음으로 다시 이동합니다.

마지막 스크립트의 주석이 달린 버전 sed:

:top;             # define label "top"
/\\$/{            # the line ends with backslash
    N;            # append next line to pattern space with embedded newline
    s/\\\n/ /;    # substitute backslash and newline with space
    btop;         # branch to "top"
}
                  # (implicit print)

관련 정보