zsh 별명에서 이스케이프 따옴표


12

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

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

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

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

(파일 이름은 bspsrobustness)

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


그건 그렇고, 이것은 모든 (Csh가 아닌 Bourne 스타일) 쉘에 적용됩니다.
Gilles 'SO- 악마 그만'

답변:


9

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

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

그리고 어떻게 부를 striplines filename까요?
Seamus

무엇을하고 있는지 설명 할 수 "$@"있습니까?
Seamus

@Seamus, 그렇습니다. 정확히 그렇게 부르겠습니다. 이 "$@"구문은 striplines 인수를 방해받지 않고 awk로 보냅니다. 즉, 파일 이름에 공백이 포함되어 있으면 필요합니다 striplines "file 1" "file 2". 두 개의 파일 이름을 awk로 보냈습니다.
glenn jackman

5

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

% 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을 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.