이 정규식은 무엇을 의미하나요?

이 정규식은 무엇을 의미하나요?

저는 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')"

관련 정보