을 사용하여 특수 문자 검색
다음 문자가 포함 된 줄을 검색하고 싶습니다.
:
/
/
?
#
[
]
@
!
$
&
"
(
)
*
+
,
;
=
%
답변
grep "[]:/?#@\!\$&"()*+,;=%[]"
괄호로 묶인 표현식 [...]
내에서
특별 " (]
, -
및 ^
및 세 가지 조합 [=
, [:
및 [.
). [...]
에 ]
를 포함하는 경우 ]
가 먼저 와야합니다 (아마도 ^
). 저는 대칭을 위해 ]
를 먼저 배치하고 [
를 마지막에 배치하기로 결정했습니다.
기억할 다른 유일한 사항은 작은 따옴표로 묶인 문자열은 작은 따옴표를 포함 할 수 없으므로 표현식 주위에 큰 따옴표를 사용합니다. 큰 따옴표로 묶인 문자열을 사용하기 때문에 셸은 확장을 위해 그 안에 찔러 넣을 것입니다. 이러한 이유로 $
를 \$
로 이스케이프하면 쉘이 리터럴 $
에서 grep
로, 우리는 !
를 \!
로 이스케이프합니다. bash
확장 (대화 형 bash
셸에서만 가능)
백 슬래시를 포함하고 싶습니까? 설정하면 쉘이 grep
에 단일 백 슬래시를 제공하도록 \\
로 이스케이프해야합니다. 또한 포함하려는 경우 백틱 `
, 그렇지 않으면 명령 대체를 시작하므로 \`
로 이스케이프해야합니다.
명령 위의 경우 괄호로 묶인 표현식에서 문자 중 하나 이상을 포함하는 모든 줄을 추출합니다.
큰 따옴표로 묶인 문자열 대신 작은 따옴표로 묶은 문자열을 사용하면 대부분의 성가심을 해결할 수 있습니다. 셸이 해석하는 문자 :
grep "[]:/?#@!$&"""""()*+,;=%[]"
여기에서 ]
, 작은 따옴표로 묶인 문자열은 작은 따옴표를 포함 할 수 없으므로 대신 세 문자열의 연결을 사용합니다.
-
"[]:/?#@!$&"
-
"""
-
"()*+,;=%[]"
<시간 />
또 다른 접근 방식은 POSIX 문자 클래스 [[:punct:]]
를 사용하는 것입니다. 이것은 !"#$%&"()*+,-./:;<=>?@[\]^_`{|}~
집합의 단일 문자와 일치합니다.이 집합은 질문에 제공된 것보다 큰 집합입니다 (추가적으로 "-.<>^_`{|}~
)이지만 POSIX가 정의하는 모든 " 구두점 문자 "입니다.
LC_ALL=C grep "[[:punct:]]"
댓글
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가 섞여 있습니다.
감사합니다!
bash: !\: event not found
오류가 발생합니다.bash
! 🙂!
도 탈출하세요 … 사용자 잊어 버렸습니다. 업데이트하겠습니다 …"[\!]"
가[\!]
로 확장됩니다. 히스토리 확장이 활성화 된 경우에도 백 슬래시와 일치합니다. ' 작은 따옴표가 필요하거나\!
outsi를 사용합니다. de of quotes.bash
,zsh
에는 csh에서 상속 된 성가신 기능도 있습니다. csh에서는!
'...'
내부 및 비대화 형일 때도 특별합니다. 그러나csh
(bash 또는 zsh와 달리)에서는"\!"
를 사용하면 여기서 작동합니다 (백 슬래시가 제거됨).