대문자로 시작하는 두 개의 연속된 단어를 찾으려고 합니다.
예
입력하다:x Yyy Zzz xx y
산출:Yyy Zzz
이제 모든 대문자를 찾을 수 있습니다cat txtfile.txt | grep -o '\<[A-Z][a-z]*\>'
출력을 얻으려면 코드를 어떻게 변경합니까?
친절한 안부
답변1
Raku(이전 Perl_6) 사용
raku -ne 'my @a = .words.rotor(2 => -1); for @a {.put if $_ ~~ $_.map(*.wordcase)};'
입력 예:
x Yyy Zzz xx y
x Yyy Zzz Www
a Mmm: Yyy bbb
aaa aaa aaa
Ccc ccc CCC
Bbb Bbb Bbb Bbb
예제 출력:
Yyy Zzz
Yyy Zzz
Zzz Www
Mmm: Yyy
Bbb Bbb
Bbb Bbb
Bbb Bbb
이 호출은 .words
Raku에게 공백으로 입력 줄을 분할하도록 지시합니다. 단어는 rotor
함께 그룹화됩니다. 이 rotor
매개변수는 (2 => -1)
단어가 겹치는 인접 쌍으로 처리되어 겹치는 단어의 연속 쌍이 각각 생성되도록 지시합니다.
단어 쌍은 $_
토픽 변수에 로드되어 일치하는지 테스트됩니다 $_.map(*.wordcase)
. 즉, 각 단어(첫 글자)가 대문자로 표시된 자체 버전과 일치하는지 테스트됩니다. 일치하는 항목이 있으면 $_
대문자(첫 글자) 단어 쌍이어야 하며 해당 단어 쌍이 반환됩니다.
한 줄씩 반환해야 하는 경우 .put
호출을 다음으로 바꿀 수 있습니다(예 print "$_, "
: ). unique
Raku에는 고유한 단어 쌍만 필요한 경우에도 루틴이 있습니다.
https://docs.raku.org/routine/wordcase
https://docs.raku.org/routine/rotor
https://raku.org
답변2
이 작업을 수행해야 합니다.
cat txtfile.txt | grep -o '[A-Z][a-z]* [A-Z][a-z]*'
답변3
Quasimodo의 예와 기타 가능한 사례를 취하고 구두점이 일치해야 하며 두 개 이상의 연속 단어가 대문자로 표시된다고 가정하면 GNU를 사용하십시오 grep
.
$ cat file
x Yyy Zzz xx y
x Yyy Zzz Www
a Mmm: Yyy bbb
aaa aaa aaa
Ccc ccc CCC
Bbb Bbb Bbb Bbb
$ grep -P '[AZ][^ ]*(?: +[AZ][^ ]*)+' 파일 엑스yyyZzzxxy 엑스으이 Zzz www ㅏ흠: 흠bbb 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프 퍼프
[A-Z][^ ]*
대문자 뒤에 공백이 아닌 문자가 오는 단어를 찾습니다.(?: +[A-Z][^ ]*)+
하나 이상의 공백 다음에 언급된 패턴이 하나 이상 반복되는 항목과 일치합니다.
@cas가 제안한 것처럼 대안이 있습니다.
를 사용하면 -z
줄 경계를 넘어 연속된 대문자 단어를 감지합니다(예: CCC\nBbb
). 공백 대신 사용하면 \s
탭 및 다른 공백에서도 작동합니다.
grep -z -P '[A-Z][^\s]*(?:\s+[A-Z][^\s]*)+' file