함수에서 heredoc을 사용하여 grep

함수에서 heredoc을 사용하여 grep

터미널에 붙여넣은 텍스트를 구문 분석하는 함수를 만들고 싶습니다.

$ cat <<eof | grep --color sometext
> foo
> sometext
> sometext1
> a sometext
> asdf
> 
> eof
sometext
sometext1
a sometext

위의 작업이 작동하는 동안 별칭이나 해당 기능을 만들 수 없습니다.

alias gsi='cat <<eof | grep --color "$1"'
gsi { cat <<eof | grep --color "$1" ; }

함수 정의시 리디렉션이 수행되지 않는 것 같습니다.

답변1

alias 'gsi=<<eof grep --color'

대체가 다시 쉘 코드로 해석되는 전처리기 텍스트 대체와 같은 별칭으로 작동할 수 있습니다.

당신의 시스템은 당신이 했던 방식대로 작동하지 않습니다 "$1". gsi file.txt로 대체된 cat <<eof | grep --color "$1" file.txt셸은 명령줄 해석을 진행하며, $1이 시점에서 미리 수행하지 않는 한 셸의 첫 번째 위치 인수는 비어 있을 수 있습니다 set something. 그래서 "$1"여기서 삭제하고 싶습니다 . UUOC를 삭제할 수도 있습니다.

gsi() { cat <<eof | grep --color "$1" ; }

eof그 뒤의 행이 누락되었기 때문에 구문론적인 관점에서 볼 때 잘못된 것입니다 cat <<eof.

답변2

귀하의 함수에서는 다음 문서를 사용하지 않습니다.

gsi () {
   grep --color "$@"
}

grep이렇게 하면 공개 라인에서 다른 옵션과 함께 패턴을 전달 하고 grep표준 입력에서 읽을 수 있습니다.

을 누르면 입력이 종료되었음을 알립니다 Ctrl+D.

위 내용은 붙여넣은 내용과 결과가 혼합된 것일 수 있습니다 grep. 먼저 붙여넣은 내용을 모아주세요그 다음에실행하려면 grep다음과 같은 것을 사용할 수 있습니다.

gsi () {
    trap 'rm -f "$buffer"' RETURN
    local buffer="$(mktemp)"
    cat >"$buffer" && grep --color "$@" "$buffer"
}

grep여기서 붙여넣은 출력은 실행되기 전에 임시 파일에 저장됩니다. 함수가 종료되면 임시 파일이 삭제됩니다. bash여기에 문서를 붙여 넣을 때 뒤에서 일어나는 일이 대략 이렇습니다 .

답변3

터미널에 붙여넣고 싶다고 말씀하셨습니다. here-doc를 완전히 버리고 적절한 클립보드 유틸리티 xclip( 예 pbpaste: Mac OS X의 경우)를 사용하세요. 이 작업이 xclip완료됩니다.

xclip -o -sel clip | grep --color 'sometext'

당신은 또한 볼 수 있습니다"xclip" 대 "xsel"두 유틸리티의 차이점에 대해.

관련 정보