bash, gawk 및 gensub()는 백슬래시를 어떻게 연속적으로 처리합니까?

bash, gawk 및 gensub()는 백슬래시를 어떻게 연속적으로 처리합니까?

파일이 있어요

$ cat f2
line 1; li
ne 2$

마지막 것은 $파일 내용의 일부가 아닌 bash 프롬프트입니다.

노력하고있어gawk를 사용하여 숫자로 끝나지 않는 각 줄을 다음 줄과 연결합니다.. 하지만 이전 게시물과 달리 이제 저는 개행 문자 앞에 다양한 수의 백슬래시를 시도하여 bash, gawk 및 gensub()가 백슬래시를 처리하는 방법을 알아내려고 합니다 \n. 세 개 이상의 백슬래시가 앞에 오는 gawk 명령이 n숫자로 끝나지 않는 줄을 찾을 수 없는 이유는 무엇인지 궁금합니다. 그렇지 않으면 성공할 것입니다. 일반적으로 bash, gawk 및 gensub()는 백슬래시를 순서대로 어떻게 처리합니까? 감사해요.

$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\n", "\\1", "g"); print b}' f2
line 1; line 2
$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\\n", "\\1", "g"); print b}' f2
line 1; line 2
$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\\\n", "\\1", "g"); print b}' f2
line 1; line 2
$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\\\\n", "\\1", "g"); print b}' f2
line 1; li
ne 2

\n, \\n및 gawk가 각각 bash 및 gawk를 통해 전달될 때 gawk \\\n\\\\ngensub()가 무엇을 보는지 설명할 수 있습니까 ?

예 를 들어 \n, bash는 (bash의 작은 따옴표 때문에) 이를 수정하지 않으므로 gawk가 \n이를 볼 수 있습니까? gawk는 gensub()가 보는 \n대로 수정됩니다 . 그렇다면 gensub()는 일치하는 개행 문자임을 왜 알 수 있습니까?nn

답변1

에는 강한 따옴표가 있으므로 를 사용하면 리터럴이 로 전달되고 를 사용하면 리터럴이 전달 bash됩니다 . 변형이 없습니다.'...''\n'\nawk'\\n'\\n

에서는 awk내부 및 "..."...이 확장됩니다. 따라서 (또는 그 안의 어떤 것)에 전달되면 이는 실제 개행 문자이고, 전달되면 .\n\\"\n"gensub()printawk"\\"\

첫 번째 인수는 이제 구현마다 달라지는 특별한 의미를 갖는 gensub()정규식으로도 이해됩니다 .\

구현 간에 일관된 점은 정규 \\표현식이 리터럴과 \마찬가지로 리터럴과 일치한다는 것입니다 . 그러나 정규식의 경우 개행 또는 a와 일치할지 여부는 구현에 따라 다릅니다. 의 경우 개행 문자가 일치합니다. 따라서 둘 다 개행 문자를 로 대체합니다 . 첫 번째는 리터럴 개행 문자가 에 전달되고 두 번째는 개행과 일치하는 정규식으로 이해되기 때문입니다.\..\nngawkgensub("\n", "x")gensub("\\n", "x")xgensub()\ngensub()

과거에 POSIX 사양에서 이 문제를 처리했다는 점에 유의하세요 awk. 이는 사양의 다음 버전에서 수정될 예정입니다. 바라보다http://austingroupbugs.net/view.php?id=1105더 알아보기.

/\n/대신 사용하면 더욱 혼란스러워집니다 "\n".

관련 정보