을 사용하여 특수 문자 검색

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

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

답변

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

괄호로 묶인 표현식 [...] 내에서

특별 " (], -^ 및 세 가지 조합 [=, [:[.). [...]]를 포함하는 경우 ]가 먼저 와야합니다 (아마도 ^). 저는 대칭을 위해 ]를 먼저 배치하고 [를 마지막에 배치하기로 결정했습니다.

기억할 다른 유일한 사항은 작은 따옴표로 묶인 문자열은 작은 따옴표를 포함 할 수 없으므로 표현식 주위에 큰 따옴표를 사용합니다. 큰 따옴표로 묶인 문자열을 사용하기 때문에 셸은 확장을 위해 그 안에 찔러 넣을 것입니다. 이러한 이유로 $\$로 이스케이프하면 쉘이 리터럴 $에서 grep로, 우리는 !\!로 이스케이프합니다. bash 확장 (대화 형 bash 셸에서만 가능)

백 슬래시를 포함하고 싶습니까? 설정하면 쉘이 grep에 단일 백 슬래시를 제공하도록 \\로 이스케이프해야합니다. 또한 포함하려는 경우 백틱 `, 그렇지 않으면 명령 대체를 시작하므로 \`로 이스케이프해야합니다.

명령 위의 경우 괄호로 묶인 표현식에서 문자 중 하나 이상을 포함하는 모든 줄을 추출합니다.


큰 따옴표로 묶인 문자열 대신 작은 따옴표로 묶은 문자열을 사용하면 대부분의 성가심을 해결할 수 있습니다. 셸이 해석하는 문자 :

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

여기에서 ], 작은 따옴표로 묶인 문자열은 작은 따옴표를 포함 할 수 없으므로 대신 세 문자열의 연결을 사용합니다.

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

<시간 />

또 다른 접근 방식은 POSIX 문자 클래스 [[:punct:]]를 사용하는 것입니다. 이것은 !"#$%&"()*+,-./:;<=>?@[\]^_`{|}~ 집합의 단일 문자와 일치합니다.이 집합은 질문에 제공된 것보다 집합입니다 (추가적으로 "-.<>^_`{|}~)이지만 POSIX가 정의하는 모든 " 구두점 문자 "입니다.

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

댓글

  • @ilkkachu '

    감사합니다!

  • 명령을 실행하려고하면 bash: !\: event not found 오류가 발생합니다.
  • @ user9371654 Darn bash! 🙂 !도 탈출하세요 … 사용자 잊어 버렸습니다. 업데이트하겠습니다 …
  • "[\!]"[\!]로 확장됩니다. 히스토리 확장이 활성화 된 경우에도 백 슬래시와 일치합니다. ' 작은 따옴표가 필요하거나 \! outsi를 사용합니다. de of quotes.
  • '는 bash, zsh에는 csh에서 상속 된 성가신 기능도 있습니다. csh에서는 ! '...' 내부 및 비대화 형일 때도 특별합니다. 그러나 csh (bash 또는 zsh와 달리)에서는 "\!"를 사용하면 여기서 작동합니다 (백 슬래시가 제거됨).

Answer

다음과 같은 경우 [:punct:] 문자 클래스를 사용할 수 있습니다. 다른 구두점 및 특수 문자와도 일치하므로 신경 쓰지 마십시오.

grep "[[:punct:]]" file 

댓글

  • punct 문자 클래스 (매크로가 아님)는 C 로케일의 !"#$%&'()*+,-./:;<=>?@[\]^_ {|} ~`와 일치하며, 이는 다음보다 약간 큰 문자 세트입니다. 사용자가 가지고 있지만 충분할 수 있습니다.

답변

전체 정규식을 사용하여 특수 문자 인 한 문자를 찾는 경우 대괄호 안에 특수 문자가 있습니다. 정규 표현식을 연습하고 배우고 확인하는 훌륭한 리소스는 regex101.com 입니다.

이것은 Perl 정규 표현식을 사용하며, -P 옵션과 함께 GNU grep과 함께 사용할 수 있습니다.

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

backsl이 필요합니다. 셸에서 특별한 의미가 있기 때문에 달러 기호 앞에 재가 표시되며 첫 번째 백 슬래시는 셸에서 이스케이프됩니다. (앞에 백 슬래시가 하나만 있으면 셸은 백 슬래시를 제거하고 grep는 줄 끝을 의미하는 이스케이프 처리되지 않은 달러 기호를보고 모든 입력 줄과 일치합니다.)

터미널이 색상을 지원하는 경우 색상도 적용합니다.

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

다음은

regex101.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) 

댓글

  • 아니요, 표준 ERE를 사용하면 ' 종료를 이스케이프 할 수 없습니다. 백 슬래시가있는 ]. 백 슬래시는 특수한 내부 대괄호 표현식이 아닙니다. 대괄호 표현식 안에 ]를 넣으려면 먼저 [ot\]her]가 아니라 []other] 여야합니다. div>. 이는 ' regex101이 기본적으로 설명하는 PCRE와 다릅니다.
  • pcregrep 또는 GNU

입니다. 그리고 어떤 의미에서 Perl 동작은 더 간단합니다. 백 슬래시는 항상 특수 문자를 정상으로 만듭니다.

  • -P로 수정되었습니다. 죄송합니다. -E와 -P가 섞여 있습니다.