Bash에서 이중 문자를 찾는 정규식

Bash에서 이중 문자를 찾는 정규식

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

주요 문제: 동일한 문자가 n번 나오는 것을 찾기 위해 정규 표현식을 정의하는 aa, ll, 등 의 시퀀스를 쉽게 찾을 수 있는 방법이 있습니까 ? ttttt제가 찾고 있는 것은 아주 아주 기본적인 수준에서 이것을 달성하는 것입니다. 명령줄에서. 리눅스 쉘에서.

꽤 많은 연구 끝에 나는 다음과 같은 답변과 그로부터 발생하는 질문을 생각해 냈습니다. 그래서 그들은 단지 해결책이 어디에 있는지에 대한 힌트를 제공할 뿐입니다. 하지만:

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

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

질문: 간격을 설정해야 하는 필요성이 실제로 내가 사용하는 명령과 관련이 있습니까? 그렇다면 여기에서 (e)grep을 사용할 때 고려해야 할 사항이 무엇인지 말해 줄 수 있는 사람이 있습니까?

b) 나는 찾았다이 답변은 여기에 있습니다내 문제의 경우 이것이 정확히 내가 원하는 것은 아니지만 다음과 같습니다.

grep -E '(.)\1' filename동일한 문자가 여러 번 나타나는 항목을 찾습니다.아무리 자주라도. 이것은 내가 찾고 있는 것과 비슷하지만 여전히 몇 가지 반복을 설정하고 싶습니다.

아마도 이것을 두 개 이상의 질문으로 나누어야 할 것 같지만 여기서는 이 훌륭한 사이트를 압도하고 싶지 않습니다.

추신: 또 다른 질문입니다. 주제와 다를 수도 있지만, 예 in, inside여전히 그렇습니다. 그리고 그게 맞나요?aton the shellon the command line

답변1

이것은 실제로 두 가지 질문이므로 별도로 답변해야 합니다. 하지만 대답은 비교적 간단하므로 여기에 두겠습니다. 이 답변은 GNU에만 해당됩니다 grep.

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

man페이지 에서 :

기본 정규식과 확장 정규식

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

man역사적 규칙과 이식성에 대한 자세한 내용은 해당 페이지를 참조하세요.

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

답변2

그러면 동일한 문자가 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에서 시도했는데 거기에서는 작동하지만 다른 grep에서는 작동하지 않습니다. 다음 버전 중 하나를 사용해야 합니다.

일반 grep 버전:

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

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

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

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

-o옵션은 표준 grep btw도 아닙니다(grep이 -o를 이해하면 역참조도 수행할 수 있음).


노트: grep -E '(.)\1{2,}'파일 및 grep '\(.\)\1\{2\}'파일은 오류이므로 Alexis가 지적한 대로 무시해야 합니다.

답변3

우선, 여러분의 지지적인 의견과 제안에 감사드립니다. 나는 그 대답에 꽤 가까웠다는 것이 밝혀졌습니다.

이것주요 문제그것은 관하여:

쉽게 찾을 수 있는 방법이 있나요N동일한 문자가 발생하는 경우(예 aa:tttttt

짧은 답변:

a다음 명령의 [변형] 은 적어도 한 번 이상 무한히 반복됩니다 .

grep 'a\{1,}

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

egrep a{1,}

또는 사용 가능한 GNU 정규 표현식을 사용하세요. grep a\+


반복 횟수는 모드 {min,max}→ 정확한 횟수 {n}반복 , 최소 횟수 반복, 최소 최대 횟수 반복을 통해 중괄호 안에 설정됩니다.n{n,}n{n,m}nm

따라서 제안된사소한 문제:

내가 사용하는 명령어와 관련된 간격을 설정해야 하는 필요성이 있나요?

짧은 답변: 예, 백슬래시 사용 여부 grepegrep

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

grep이것은 짧은 답변이고 비슷한 문제에 직면한 사람들에게 도움을 주고 싶었기 때문에 사람들이 및 를 사용할 때 주의해야 할 것으로 보이는 사항에 대한 기본 요약을 추가했습니다 egrep.




기본, 확장 및 GNU 정규식

기본 정규식

및 명령 에 사용됩니다 grep.edsed

기본 정규식 집합 함수는 다음과 같습니다.

  • 대부분의 메타 문자(예: ? [ . \ )등)는 백슬래시를 통해 활성화됩니다. 백슬래시가 없으면 검색어(의 일부)로 처리됩니다.
  • ^ $ \<\>백슬래시 없이 지원
  • 단축 문자 [ \b, \s등] 없음

암소 비슷한 일종의 영양여기에 기본 정규 표현식이 추가됩니다.

  • \?문자를 0회 또는 1회 반복하고( sum c\?과 일치 )ccc\{0,1\}
  • \+문자를 한 번 이상 반복하고( c\+일치 cccccccccc) 대체 문자입니다.\{1,\}

  • \|지원(예: 지원 grep a\|b을 찾 a거나b

grep -E전체 확장 정규식 세트를 사용하도록 명령을 활성화합니다.


확장 정규 표현식 [ERE]

egrep, awk및 의 경우 emacs기본 세트에 몇 가지 기능이 더해졌습니다.

  • 메타문자는 백슬래시를 통해 비활성화됩니다.
  • 역참조 없음
  • else: 일반적으로 할 수 있는 마법 같은 정규 표현식이 많이 있습니다.

암소 비슷한 일종의 영양확장 정규식

다음 기능을 추가하세요

이 두 링크는 ​​내가 여기서 받은 큰 지원 외에도 정말 많은 도움이 된 정규 표현식.info로 연결됩니다.

답변4

다른 사람들이 유용하다고 생각할 수 있으므로 내 솔루션을 제시하겠습니다.

그냥 일치합니다 <character>+(character).

z='foo_bar__yo___hak____woot_tut'
echo ${z//_+(_)}
foo_baryohakwoot_tut

한 단계 더 나아가 다음과 같이 혼합 하위 문자열을 바꿀 수 있습니다.

z='foo_bar__yo___hak__-_woot_tut'
echo ${z//_+([-_])/_}
foo_bar_yo_hak_woot_tut

관련 정보