zsh 별칭에서 따옴표를 이스케이프 처리하세요.

zsh 별칭에서 따옴표를 이스케이프 처리하세요.

따르다이 문제텍스트에서 줄 바꿈을 제거하는 것과 관련하여 다음과 같이 zsh 별칭으로 변환하고 싶습니다.

alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'

awk 스크립트에서 따옴표를 이스케이프하려고 시도했지만 다음 오류가 발생했습니다.

awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted

(파일 이름은 bspsrobustness)

내가 원하는 것을 할 수 있는 방법이 있나요? 나는 이것을 zsh 별칭 대신 awk 스크립트로 바꿀 수 있다고 생각합니다. 이것이 최선의 선택입니까?

답변1

별칭 대신 zsh 함수를 사용할 수 있습니다. 인용 고리를 뛰어 넘을 필요가 없습니다.

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}

답변2

무슨 일이 일어나고 있는지 보려면 다음을 실행하세요.

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

문자는 큰따옴표로 묶여 있기 때문에 $(별칭 확장 후 확장될 때) 쉘에서 해석됩니다. 적절한 인용을 얻으려면 전체 별칭 정의를 작은따옴표로 묶는 것이 더 쉽습니다. 작은따옴표 안에 있는 내용은 별칭을 사용할 때 확장되는 내용입니다. 매개변수는 이제 awk큰따옴표로 묶여 있습니다. 분명히 이전에는 백슬래시가 필요했습니다 \"$.

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

작은 따옴표로 묶인 문자열을 작은 따옴표로 묶는 데 유용한 관용구는 '\''작은 따옴표로 묶인 문자열 안에 리터럴 작은 따옴표를 넣는 것과 거의 비슷하다는 것입니다. 기술적으로 작은 따옴표로 묶인 문자열, 백슬래시 따옴표 '및 다른 작은 따옴표로 묶인 문자열이 연결됩니다. ''끝에 있는 빈 문자열은 제거할 수 있습니다.

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

이렇게 긴 설명을 마친 후 제안 사항은 다음과 같습니다. 별칭에 비해 별칭이 너무 복잡한 경우기능 사용.

답변3

을 사용하는 경우에는 zsh켤 수도 있습니다.rcquotes옵션:

''작은따옴표로 묶인 문자열 내에서 작은따옴표를 나타내는 일련의 문자가 허용됩니다 . $'...'백슬래시 작은따옴표를 사용할 수 있는 형식을 사용하는 따옴표 붙은 문자열에서는 이 기능이 작동하지 않습니다 .

따라서 대신

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

rcquotes사용

setopt rcquotes
alias striplines='print -lr awk '' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'''

또는 다음을 사용하여 $'...'작성할 수 있습니다.

alias striplines=$'print -lr awk \' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}\''

관련 정보