Bash에서 이중 문자를 찾기위한 정규식


10

명령 줄 (Bash)에서 텍스트, 목록 등에서 이중 문자의 모든 발생을 찾는 정규식을 찾고 있습니다.

주요 질문 : 같은 시퀀스를 찾는 간단한 방법이 aa, ll, ttttt, 등 어디 하나 개 정의하는 정규 표현식 그와 같은 문자를 n 회 발생에 대한 외모? 내가 찾고있는 것은 매우 기본적인 수준에서 이것을 달성하는 것입니다. 명령 행에서. 리눅스 쉘에서.

아주 약간의 연구를 한 후 나는 다음과 같은 답변에 이르렀습니다. 그 결과로 그들은 해결책이 어디 있는지 힌트를주었습니다. 그러나:

a) (e) grep 및 백 슬래쉬 문제

  • grep 'a\{2\}' 찾다 aa
  • egrep'a{2}' 찾다 aa

질문 : 백래시를 설정해야 할 필요성이 실제로 사용하는 명령에 묶여 있습니까? 그렇다면 (e) grep을 사용할 때 고려해야 할 사항이 있으면 누구나 알려주세요.

b) 나는 이 질문에 대한 답을 여기 에서 찾았 지만 정확히 내가 찾던 것이 아닙니다.

grep -E '(.)\1' filename같은 문자가 두 번 이상 나타나는 항목을 찾지얼마나 자주 묻지는 않습니다 . 이것은 내가 찾고있는 것에 가깝지만 여전히 많은 반복을 설정하고 싶습니다.

아마 이것을 두 개 이상의 질문으로 나눠야하지만이 멋진 사이트를 범람하고 싶지 않습니다.

PS : 또 다른 질문, 아마도 주제 끌 수 있으나 : 그것은이다 in, inside, at또는 on the shell. 그리고 on the command line맞습니까?

답변:


8

이것은 실제로 두 가지 질문이며 분리되어 있어야합니다. 그러나 대답은 비교적 간단하기 때문에 여기에 넣겠습니다. 이 답변은 GNU를위한 grep것입니다.

a) egrep는와 동일합니다 grep -E. 둘 다 grep기본 정규 표현식 대신 "확장 정규 표현식"을 사용해야 함을 나타냅니다 . grep일반 정규식에는 백 슬래시가 필요합니다.

로부터 man페이지 :

기본 정규 표현식과 확장 정규 표현식

기본 정규 표현식에서 메타 문자 ? , + , { , | , ( , 및 ) 는 특별한 의미를 잃습니다. 대신 백 슬래시 버전을 사용 하시겠습니까? , \ + , \ { , \ | , \ ( , \) 입니다.

참고 항목 man역사적 관습과 휴대에 대한 자세한 내용은 페이지를.

b) 빼고 1을 바꾸려는 문자 수를 사용 egrep '(.)\1{N}'하고 바꿉니다 N(점은 첫 번째 문자와 일치하므로). 따라서 4 번 반복되는 문자를 일치 시키려면을 사용하십시오 egrep '(.)\1{3}'.


매뉴얼 페이지를 읽을 때 나는 당신이 지적한 부분을 정말로 오해하거나 잘못 해석했을 것입니다. 정규식 자습서를 통해 작업했을 때 이러한 동작에 대한 힌트는 기대되지 않았습니다. 정규 표현식은 대부분의 응용 프로그램이 동일한 기호 집합으로 작업하는 기본 수준의 무언가를 의미한다고 생각했습니다. 다시, 나는 틀렸다는 것이 증명되었다. 당신의 도움을 주셔서 감사합니다! 이것은 정말로 나를 도왔습니다.
erch

" ., + 등의 문자에서 특별한 의미를 취하기 위해 항상 백 슬래시를 사용하십시오 "를 읽는 것이 매우 혼란스럽고 가장 기본적인 명령의 규칙과 반대되는 것이 규칙이라는 것을 알 수 있습니다.
erch

@ cellar.dweller 혼란 스러워요! 많은 추론은 역사적입니다. 나는 언제나 사용하는 습관을 만드는, 그래서 나는, 확장 된 형태에 익숙해있어 egrep(단순한 문자열 일치 반대) 나 정규 표현식을 필요로하는 경우를 나는 사이의 차이점을 기억에 대해 걱정할 필요가 없습니다 그래서 grep'의 두 정규 표현식의 유형.
depquid

4
표준 ERE는 역 참조를 지원하지 않지만 표준 BRE는 지원합니다. 그래서 grep '\(.\)\1\{3\}'표준이다, grep -E '(.)\1{3}'아니다.
Stéphane Chazelas

7

이것은 동일한 캐릭터에서 2 개 이상의 어커런스를 찾습니다.

grep -E '(.)\1+' file

awk에 -o 옵션이 있으면 각 줄을 새 줄에 인쇄합니다.

grep -Eo '(.)\1+' file

정확히 3 개의 일치하는 항목을 찾으려면 다음을 수행하십시오.

grep -E '(.)\1{2}' file

또는 3 이상 :

grep -E '(.)\1{2,}' file

기타..


편집하다

실제로 @stephane_chazelas는 역 참조 및 -E에 대해 옳습니다. 나는 그것을 잊었다. BSD grep과 GNU grep에서 시도했지만 작동하지만 다른 greps에는 없습니다. 아래 버전 중 하나를 사용해야합니다.

일반 그렙 버전 :

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

-o옵션은 BTW 또한 표준 그렙하지 않습니다 (당신의 GREP이 또한 다시 참조 할 수 있습니다 -o 이해 아마도 경우) ..


참고 : 알렉시스가 지적한 것처럼 grep -E '(.)\1{2,}'파일과 grep '\(.\)\1\{2\}'파일이 잘못되어 무시해야합니다.


지금까지 감사합니다. 그러나 : 오전 난 지금 말하는 를 빼고 -E옵션이 grep많은 일을하지 않을까요? 예를 들어, 내가 잘못한 곳을 찾는 데 너무 많은 시간을 낭비한 이유는 무엇입니까?
erch

-E 옵션을 사용하지 않으면이 경우에도 동일한 작업을 수행 할 수 있지만 더 이상 탈출해야하며 +연산자 가 없습니다 . 예제도 게시하겠습니다.
Scrutinizer

작은 수정 : grep -E '(.)\1{2}'정확히 "정확하게 3 개의 일치 항목 찾기"가 아닙니다. 정확히 3 개의 동일한 문자 와 일치 하지만 더 긴 반복 문자열에 포함될 수 있습니다. 예를 들어 5 기호 문자열과 일치합니다 AAAAA. 연속 된 심볼이 6 개 이상인 경우 두 번 이상 일치합니다.
Alexis

네, 당신은 절대적으로 맞습니다. 의도 한대로 작동하지 않습니다. 사실 그렇게 불가능합니다.
Scrutinizer

3

먼저, 여러분의지지 의견과 제안에 감사드립니다. 그것이 이미 답변에 매우 가깝다는 것이 밝혀졌습니다.

주요 문제 에 대한했다 :

를 찾을 수있는 간단한 방법이 N 예를 들어 같은 문자의 발행 수는 aa,tttttt

짧은 답변 :

다음의 [variations of] 명령은 a최소 한 번 이상 무한 반복됩니다

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

또는 GNU 정규식 사용 가능 grep a\+


repeatings의 수는 패턴을 통해, 중괄호 안에 설정 {min,max}{n}반복 정확히 n, 번 {n,}이상 반복 n{n,m}반복 적어도 n그러나 대부분에 m시간.

결과적으로 2 차 문제가 발생했습니다 .

사용하는 명령에 백래시를 설정해야합니까?

짧은 대답 : 예, 백 슬래시의 사용 여부를 하나 개의 용도에 따라 grep또는egrep

  • grep: 백 슬래시가 메타 문자를 활성화합니다 [기본 정규 표현식 사용]
  • egrep백 슬래시가 메타 문자를 비활성화합니다. [확장 정규식 사용]

이 짧은 대답으로, 나는 비슷한 문제로 실행하는 사람들을 제공하고자, 나는 1에서 보이는 작업, 인식하는 무슨 내 기본 요약 추가 grepegrep.




기본, 확장 및 GNU 정규식

기본 정규식

에서 사용 grep, edsed명령

기본 정규식 세트 기능은 다음과 같습니다.

  • 예를 들어 대부분의 메타 문자 ? [ . \ )는 백 슬래시를 통해 활성화됩니다. 백 슬래시가 없으면 검색 용어로 사용됩니다.
  • ^ $ \<그리고 \>백 슬래시없이 지원
  • 어떤 속기 문자 없음 [ \b, \s등]

GNU 기본 정규 표현식에 추가

  • \?반복 문자가 0 또는 1 시간 ( c\?일치 ccc)과에 대한 대안\{0,1\}
  • \+캐릭터에게 상기 적어도 하나의 시간 (반복 c\+일치 cc, cccccccc등) 및 대한 대안\{1,\}

  • \|지원됩니다 (예 grep a\|b를 찾습니다 a또는b

grep -E 명령이 전체 확장 정규 표현식 세트를 사용할 수 있도록합니다.


확장 정규 표현식 [ERE]

의 사용 egrep, awk그리고 emacs기본 설정 플러스 꽤 기능입니다.

  • 메타 문자는 백 슬래시를 통해 비활성화됩니다
  • 역 참조 없음
  • 다른 것 : 많은 정규 표현식이 보통 하나를 위해 할 수있는 것

GNU 확장 정규 표현식

다음 기능을 추가합니다

두 개의 링크는 하나를 regular-expressions.info로 안내합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.