bash 스크립트에서 대문자로 시작하는 단어를 필터링하는 방법은 무엇입니까? text.txt가 있는데 대문자(Nnnn)로 시작하는 단어만 찾고 싶습니다.

bash 스크립트에서 대문자로 시작하는 단어를 필터링하는 방법은 무엇입니까? text.txt가 있는데 대문자(Nnnn)로 시작하는 단어만 찾고 싶습니다.

대문자로 시작하는 단어만 찾고 싶습니다. 연설은 이 패턴을 따라야 합니다. "어 허".

텍스트가 포함된 .txt 파일이 있습니다. 나는 성공하지 못한 채 grep을 사용해 보았습니다.

답변1

따라서 대문자 뒤에 4개의 문자가 와야 합니다. 예를 들면 다음과 같습니다.

$ cat test
lower
Upper
notrequired
This1
$ grep '[A-Z]....' test
Upper
This1

점( .)은 개행 문자를 제외한 모든 문자와 일치합니다.

답변2

grep비표준 -w및 옵션을 지원 하는 경우 -o다음을 수행할 수 있습니다.

grep -wo '[[:upper:]][[:lower:]]*'

하나의 대문자와 0개 이상의 소문자로 구성된 o단어를 출력합니다 w(이 경우 단어는 단어가 아닌 문자로 구분되고 단어 문자는 숫자 또는 밑줄입니다).

예를 들어 다음과 같은 입력의 경우:

Let's rock the UK, Stéphane! tEst Test2

다음과 같이 출력됩니다.

Let
Stéphane

é단일 소문자 U+00E9 문자로 표현 하면 됩니다 . e뒤에 U+0301과 날카로운 악센트를 결합하여 표현하면 , U+0301은 U+0301로 간주되지 않습니다 Let.Ste성격.

이 문제를 해결하기 위해 태그 결합을 허용할 수도 있습니다. 이 경우 다음 grep과 같은 perl정규식 지원이 필요합니다.

grep -Po '\G(\X*(?=[^\w])\X)?\K\p{Lu}[\p{Ll}\pM]*+(?!\w)'

어디:

  • \G줄의 시작 부분이나 이전 일치 항목의 끝 부분과 일치합니다.
  • \X자소 클러스터와 일치하므로 분해를 허용하지 않고 기본 문자와 모든 결합 토큰(또는 더 일반적으로 분해된 문자)을 포함합니다.
  • (?=[^\w])\Xgrep -w는 와 같은 단어를 적절하게 구분하여 예를 들어 Foo포함에서 발견된 경우 보고되지 않고 éFooé가 로 표시 되도록 하기 위해 단어가 아닌 문자로 이어지는 문자소 클러스터입니다 e<U+0301>.
  • \K오른쪽에 있는 내용 만 K읽고 출력 하도록 일치 시작을 재설정합니다 . 와 함께 사용하면 일반적으로 Perl/PCRE에서 연산자를 찾는 데 고정 길이 일치가 사용된다는 사실을 해결합니다.o\G\K
  • \p{Lu}uPOSIX' 와 동등한 perl 인 ppercase Letter rperty 와 문자를 일치시킵니다 .p[[:upper:]]
  • \pMM방주 용 , 작은 캐비닛용 글자 \p{Ll}용 .lL
  • *+역추적을 비활성화하는 것과 비슷 *하지만 모든 토큰과 소문자를 영구적으로 포함하므로 토큰에 대해 걱정할 필요가 없습니다.
  • (?!\w), 부정적인 전망성격. 위의 내용이 없으면 인스턴스 반환 ( as 사용)을 피해야 +합니다 .(?![\w\pM])FeFéFéeU+0301

답변3

또한 시도

grep -o "\b[[:upper:]].*\b" file

-o옵션은 발견된 일치 항목만 출력하고 \b전체 단어만 고려 하도록 합니다 man grep.

\b 기호는 단어 가장자리의 빈 문자열과 일치합니다.

답변4

이것은 나에게 도움이되었으며 도움이 될 수 있습니다.

for i in $(cat file); do [[ $i =~ ^[A-Z].[a-z]+$ ]] && echo $i; done

관련 정보