재귀(중첩) grep이 "잘못된 문자 범위" 오류를 발생시킵니다.

재귀(중첩) grep이 "잘못된 문자 범위" 오류를 발생시킵니다.

파일이 있습니다 test.xml(아래 참조). 이 grep의 작동 방식은 다음과 같습니다.

grep '<appointment-id internal:ref=1.2.3/>' test.xml

출력은 다음과 같습니다

    <appointment-id internal:ref=1.2.3/>

그러나 이것은 실패합니다.

grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml

출력은 다음과 같습니다

grep: invalid character range

콘텐츠 test.xml:

<note>
    <to>Jim</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Some text</body>
    <appointment-id internal:ref=1.2.3/>
</note>

grep이 두 명령(간단한 명령과 중첩 명령)을 를 사용하여 스크립트에 넣었습니다 set -x. 다음은 스크립트를 정확하게 복사하여 붙여넣은 것입니다.

set -x
grep '<appointment-id internal:ref=1.2.3/>' test.xml
grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml
exit 0

출력은 다음과 같습니다.

++ grep '<appointment-id internal:ref=1.2.3/>' test.xml
    <appointment-id internal:ref=1.2.3/>
+++ grep '<appointment-id internal:ref=1.2.3/>' test.xml
++ grep '    <appointment-id internal:ref=1.2.3/>' test.xml
grep: invalid character range
++ exit 0

답변1

grep출력이 터미널이 아니더라도 (내부적으로) 컬러 출력을 생성합니다. 환경 변수가 로 설정 되면 GREP_COLOR이 작업이 수행될 수 있습니다 always.

음영 제어 코드에는 외부에서 입력할 때 grep문자 범위로 해석되는 문자가 포함되어 있습니다.

이 패턴은 문자 범위로 해석될 때 아무런 효과가 없습니다.

grep--color=never해결 방법은 적절한 환경 변수( )를 명시적으로 사용하거나 설정하여 출력 색상 지정을 비활성화하는 것입니다 GREP_COLOR=never.

이것을 설정하면 예제에서 external 의 경우처럼 터미널에 쓸 때 컬러 출력만 생성해야 하지만 inner 의 경우에는 GREP_COLOR=auto그렇지 grep않습니다 .grepgrep

관련 정보