zsh 별명에서 이스케이프 따옴표 대한 이 질문

텍스트에서 줄 바꿈을 제거하는 것에 대한 이 질문 에서 다음과 같이 이것을 zsh 별칭으로 바꾸고 싶습니다.

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

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

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

(파일 이름은 bspsrobustness)

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



답변

별명 대신 zsh 함수를 사용할 수 있습니다. 인용 할 hoops가 없습니다.

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


답변

진행 상황에 대한 아이디어를 얻으려면 다음을 실행하십시오.

% 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);}'\'

이 긴 설명 후 권장 사항 : 별칭이 너무 복잡 하면 function을 사용하십시오 .


답변