grep을 사용하여 특수 문자 검색

grep을 사용하여 특수 문자 검색

다음 문자가 포함된 줄을 검색하고 싶습니다.

: / / ? # [ ] @ ! $ & ' ( ) * + , ; = %

답변1

grep "[]:/?#@\!\$&'()*+,;=%[]"

대괄호 표현식에서 "특수" 문자는 거의 없습니다( , 및 , 및 , 및 의 세 가지 조합 [...]과 같은 매우 작은 하위 집합만 ). in을 포함하는 경우 먼저 와야 합니다(아마도 a 뒤에). 대칭을 위해 첫 번째와 마지막을 배치하기로 결정했습니다.]-^[=[:[.][...]]^][

기억해야 할 또 다른 점은 작은 따옴표로 묶인 문자열에는 작은 따옴표를 포함할 수 없으므로 표현식 주위에 큰 따옴표를 사용한다는 것입니다. 큰따옴표로 묶인 문자열을 사용하고 있으므로 쉘은 확장을 위해 그 안에서 탐색합니다. 이러한 이유로 우리는 $as를 이스케이프 \$하여 쉘이 리터럴 값을 제공하게 하고 as 도 이스케이프합니다. $이는 in의 역사적 확장이기 때문입니다 (비록 대화형 쉘 에서만 가능함 ).grep!\!bashbash

컬렉션에 백슬래시를 포함하려면 \\셸이 단일 백슬래시를 제공 하도록 이를 이스케이프해야 합니다 grep. 또한 백틱을 포함하려면 `백틱도 이스케이프해야 합니다. \`그렇지 않으면 명령 대체가 시작됩니다.

위 명령은 대괄호 표현식의 문자 중 하나 이상을 포함하는 모든 행을 추출합니다.


큰따옴표로 묶인 문자열 대신 작은따옴표로 묶은 문자열을 사용하면 문자를 해석하는 쉘의 문제 대부분을 해결할 수 있습니다.

grep '[]:/?#@!$&'"'"'()*+,;=%[]'

여기서 기억해야 할 유일한 점은 의 배치 외에 ]작은 따옴표로 묶인 문자열에는 작은 따옴표를 포함할 수 없으므로 세 문자열을 연결하는 방법을 사용한다는 것입니다.

  1. '[]:/?#@!$&'
  2. "'"
  3. '()*+,;=%[]'

또 다른 접근 방식은 POSIX 문자 클래스를 사용하는 것입니다 [[:punct:]]. 이는 set 의 단일 문자와 일치합니다 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.더 큰설정은 질문에 제공된 것보다 크지만(도 포함되어 있음 "-.<>^_`{|}~) POSIX에서 정의한 모든 "구두점"입니다.

LC_ALL=C grep '[[:punct:]]'

답변2

[:punct:]다른 구두점 및 특수 문자와도 일치하는 것이 마음에 들지 않으면 문자 클래스를 사용할 수 있습니다.

grep '[[:punct:]]' file

답변3

특수 문자인 문자를 찾는 경우 전체 정규식을 사용하여 대괄호 안의 특수 문자를 찾을 수 있습니다. 정규식을 연습하고, 학습하고, 확인할 수 있는 훌륭한 리소스는 다음과 같습니다.정규식101.com.

이는 다음 옵션과 함께 GNU grep과 함께 사용할 수 있는 Perl 정규식을 사용합니다 -P.

grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"
                            ^^^

필요하신 점 참고해주세요달러 기호 앞의 백슬래시는 셸에서 특별한 의미를 갖기 때문에 첫 번째 백슬래시는 셸에서 이스케이프됩니다. (앞에 백슬래시가 있으면 쉘은 백슬래시를 제거하고 grep이스케이프 처리되지 않은 달러 기호를 확인하여 줄의 끝을 나타내며 모든 입력 줄과 일치합니다.)

터미널에서 지원하는 경우 색상을 추가할 수도 있습니다.

grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"

내 정규식에 대한 설명은 다음과 같습니다.정규식101.com

/(\:|\/|\?|\#|\@|\!|\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])/gm
1st Capturing Group (\:|\/|\?|\#|\@|\!|\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])
  \: matches the character : literally (case sensitive)
  \/ matches the character / literally (case sensitive)
  \? matches the character ? literally (case sensitive)
  \# matches the character # literally (case sensitive)
  \@ matches the character @ literally (case sensitive)
  \! matches the character ! literally (case sensitive)
  \$ matches the character $ literally (case sensitive)
  \& matches the character & literally (case sensitive)
  \' matches the character ' literally (case sensitive)
  \( matches the character ( literally (case sensitive)
  \) matches the character ) literally (case sensitive)
  \* matches the character * literally (case sensitive)
  \+ matches the character + literally (case sensitive)
  \, matches the character , literally (case sensitive)
  \; matches the character ; literally (case sensitive)
  \= matches the character = literally (case sensitive)
  \% matches the character % literally (case sensitive)
  \[ matches the character [ literally (case sensitive)
  \] matches the character ] literally (case sensitive)

관련 정보