따르다이 문제텍스트에서 줄 바꿈을 제거하는 것과 관련하여 다음과 같이 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);}\''