다음과 같은 줄이 포함된 파일이 있습니다.
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
쉘 스크립트에서 grep u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'
무엇을 하려고 합니까?
grep "u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'"
파일을 시도했지만 아무것도 돌아오지 않았습니다.
답변1
옵션 사용 -F
(고정 문자열 검색, 이전에 이 유틸리티를 사용하여 수행됨 fgrep
):
grep -F "u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'" file
.
문자는 \
정규식 연산자이며, 하나는 단일 문자와 일치하고 다른 하나는 일치하는 데 사용됩니다.탈출하다정규식 연산자 또는 새로운 연산자 도입(위에서 언급한 것처럼 x
이 동작은 POSIX에서 지정되지 않으며 구현마다 다를 수 있습니다).
따라서 그렇지 않은 경우 -F
둘 다 이스케이프해야 합니다.
Bourne과 같은 쉘 또는 fish
inside 에는 쉘에 대한 특별한 이스케이프 의미가 "..."
있으므로 \
이를 위한 또 다른 이스케이프 라운드도 필요합니다.
grep "u2py\.DynArray value=b'F\\\\xfeVOC\\\\xfeD_VOC'" file
csh 또는 tcsh에서는 다음과 같습니다.
grep "u2py\.DynArray value=b'F\\xfeVOC\\xfeD_VOC'" file
셸 rc
및 파생 클래스 에서는 "..."
참조 연산자로 지원되지 않습니다. 작은따옴표를 사용해야 합니다.
grep 'u2py\.DynArray value=b''F\\xfeVOC\\xfeD_VOC''' file
''
(작은따옴표는 작은따옴표 안에 표시됩니다 .일반 문자처럼 특수 문자를 사용하는 방법은 무엇입니까?더 많은 정보를 알고 싶다면).
답변2
다음 중 하나를 사용하십시오.
$ cat <<\END | grep -Ff - file
u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'
END
또는
$ var='u2py.DynArray value=b'"'"'F\xfeVOC\xfeD_VOC'"'"
$ grep -F -- "$var" file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
문제는 (인용문) \
이 아닌 (백슬래시)에 있는 것으로 나타났습니다 '
. 하지만 먼저 .
정규식에서 a를 리터럴로 인용해야 합니다.
$ grep "u2py\.DynArray value=b'F" file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
위에서 볼 수 있듯이 '
grep을 통해 발견되었습니다.
그러나 \x를 찾으려면 bash의 변경 사항이 엄청납니다.
$ grep "u2py\.DynArray value=b'F\\\\x" file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
왜 4개인가요 \
? 쉘은 2를 \\
로 변환 \
하고 grep은 2를 받아 \\
1로 해석합니다. 이는 정규 표현식의 특수 문자이기도 하기 \
때문입니다 .\
우리는 다음 두 단계를 볼 수 있습니다.
$ set -x; grep "u2py\.DynArray value=b'F\\\\x" file ; set +x
+ grep --color=auto 'u2py\.DynArray value=b'\''F\\x' file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
+ set +x
우리는 줄일 수 있습니다하나grep 옵션을 사용한 해석 수준 -F
.
$ set -x; grep -F "u2py.DynArray value=b'F\\x" file ; set +x
+ grep --color=auto -F 'u2py.DynArray value=b'\''F\x' file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
+ set +x
또는 다음 없이 set -x
:
$ grep -F "u2py.DynArray value=b'F\\x" file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
이 "설명"의 마지막 레이어는 제거하기 어렵습니다.
그리고모두Bourne 쉘이 바로 그런 역할을 합니다. 그리고POSIX가 필요합니다.
표준 출력에서 검색할 정확한 문자열을 생성하는 것이 가능하다면 다음을 사용할 수 있습니다.
grep -Ff - file
-F
파일( )의 -f
표준 입력( ) 에서 -
정확한 "고정 문자열"( )을 검색합니다 file
.
있을 수있다~인 것 같다일하다:
$ printf '%s\n' "u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'"
u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'
그러나 아니요, 쉘은 여전히 백슬래시가 제거되기를 기다리고 있습니다.
printf '%s\n' "u2py.DynArray value=b'F\\\\xfeVOC\\\\xfeD_VOC'"
u2py.DynArray value=b'F\\xfeVOC\\xfeD_VOC'
백슬래시 제거를 방지하는 신뢰할 수 있는 유일한 방법은 여기에 있는 설명서를 사용하는 것입니다.
구문은 보기 흉하지만 훌륭하게 작동합니다.
$ cat <<\END
u2py.DynArray value=b'F\xfeVOC\\\\xfeD_VOC'
END
(\END
END
예선두). 그러면 명령은 다음과 같습니다.
$ cat <<\END | grep -Ff - file
u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'
END
var를 사용하면 여기서 문서화할 필요가 없습니다.한 번var에 올바른 값이 있습니다.
$ var='u2py.DynArray value=b'"'"'F\xfeVOC\xfeD_VOC'"'"
$ grep -F -- "$var" file
xxx <u2py.DynArray value=b'F\xfeVOC\xfeD_VOC'>
아니면 그럴 수도 있습니다 grep -Fe "$var" file
. @StéphaneChazelas에게 감사드립니다.