명령줄(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
여전히 그렇습니다. 그리고 그게 맞나요?at
on the shell
on 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}
n
m
따라서 제안된사소한 문제:
내가 사용하는 명령어와 관련된 간격을 설정해야 하는 필요성이 있나요?
짧은 답변: 예, 백슬래시 사용 여부 grep
는egrep
grep
: 백슬래시는 메타문자를 활성화합니다. [기본 정규 표현식 사용]egrep
백슬래시덕-메타 문자 활성화 [확장 정규식 사용]
grep
이것은 짧은 답변이고 비슷한 문제에 직면한 사람들에게 도움을 주고 싶었기 때문에 사람들이 및 를 사용할 때 주의해야 할 것으로 보이는 사항에 대한 기본 요약을 추가했습니다 egrep
.
기본, 확장 및 GNU 정규식
기본 정규식
및 명령 에 사용됩니다 grep
.ed
sed
기본 정규식 집합 함수는 다음과 같습니다.
- 대부분의 메타 문자(예:
? [ . \ )
등)는 백슬래시를 통해 활성화됩니다. 백슬래시가 없으면 검색어(의 일부)로 처리됩니다. ^ $ \<
\>
백슬래시 없이 지원- 단축 문자 [
\b
,\s
등] 없음
암소 비슷한 일종의 영양여기에 기본 정규 표현식이 추가됩니다.
\?
문자를 0회 또는 1회 반복하고( sumc\?
과 일치 )c
cc
\{0,1\}
\+
문자를 한 번 이상 반복하고(c\+
일치cc
등cccccccc
) 대체 문자입니다.\{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