
저는 Unix 개행을 Windows 개행으로 변환하는 작업을 하고 있습니다. 나는 unix2dos를 시도했지만 몇 가지 바이너리 오류가 발생하여 이를 찾아보고 우연히 이 정규식을 발견했습니다.
sed 's/$'"/`echo \\r`/" input.txt > output.txt
이 정규식은 작동하지만 어떻게 작동하는지 모르겠습니다. 분명히 나는 이 형식을 통해 그것을 설명하려고 노력하고 있습니다.
sed 's/a/b/'
여기
a는 $'"를 참조합니다. 이해가 안 됩니다.
b는echo \\\r
'\r'을 참조합니다.
또한 작은따옴표와 큰따옴표의 조합을 사용하는 이유/방법을 이해할 수 없습니다. 누구든지 나에게 이 정규 표현식을 설명해 줄 수 있나요?
답변1
아니요$'"
's/$'"/`에코 \\r`/" == "s/\$/`에코 \\r`/"
$
그러나 정규식 작성자는 작은따옴표를 통해 이스케이프하는 것을 선호합니다 .
원하는 방식으로 이러한 이스케이프를 결합할 수 있습니다.
따라서 정규식은 \r
줄 끝에 추가됩니다.
고쳐 쓰다. 처음에는 echo\\r뿐만 아니라 "echo\\r"도 사용했다는 점이 명확하지 않았습니다. 여기서는 사용할 필요가 없습니다 echo
. sed에서 직접 실행할 수 있습니다.
sed 's/$/\r/'
답변2
이것은 몇 가지 복잡한 인용문입니다. 논쟁은 sed
두 부분으로 구성됩니다. 첫째, 's/$'
문자를 생성하는 작은따옴표로 묶인 문자열 리터럴이 있습니다 s/$
. 그 뒤에는 명령 대체를 포함하는 큰따옴표 문자열이 옵니다 `echo \\\r`
. 그러면 쉘을 기반으로 CR 문자를 echo \r
인쇄하는 명령이 실행됩니다 . \r
(인쇄된 텍스트는 echo
개행 문자로 끝나지만 명령 대체로 인해 내용이 소모됩니다.) 이 명령이 원하는 효과를 얻으려면 echo \r
여기서는 로 표시하는 CR 문자를 인쇄하는 시스템을 사용해야 합니다 ␍
.
sed의 주장은 다음과 같습니다 s/$/␍/
. 그러면 정규식의 모든 항목이 $
문자열로 대체됩니다 ␍
. 정규식은 $
빈 문자열과 일치하지만 줄 끝에서만 일치하므로 이 sed 명령은 각 줄에 CR을 추가합니다. Unix 줄은 LF로 끝나고 Windows 줄은 CR+LF로 끝나기 때문에 Unix 줄 끝은 Windows 줄 끝으로 변환됩니다.
GNU sed(다른 버전은 아님)는 백슬래시 이스케이프를 이해합니다 \r
. 따라서 GNU sed를 사용하면 를 작성할 수 있습니다 sed 's/$/\r/'
. 그러나 이는 다른 sed 구현(BSD, Solaris 등)에서는 작동하지 않습니다. echo \r
휴대성도 좋지 않습니다. 이식 가능한 솔루션은 tr
백슬래시가 표준으로 이스케이프되는 를 사용하는 것입니다.
sed "$(echo 's/$/@/' | tr '@' '\r')"