/usr/dict/words에서 특정 속성을 가진 단어를 검색하세요.

/usr/dict/words에서 특정 속성을 가진 단어를 검색하세요.

내가 지정한 특정 기준을 충족하는 모든 단어에 대해 /usr/dict/words를 검색하는 스크립트를 작성하고 싶습니다. 예를 들어, 모든 회문 단어(예: "racecar", "madam" 등)를 찾거나 첫 번째와 두 번째 절반이 반전되어 단어를 형성하는 모든 단어(예: "german" 및 "manger")를 찾습니다. 스크립트의 뼈대는 사전의 각 단어를 읽는 간단한 루프가 될 것이며, 찾고자 하는 항목에 따라 표현식이나 유사한 항목을 대체하여 기준을 변경할 수 있습니다.

어떻게든 정규식을 포함해야 한다고 생각합니다(또는 각 단어의 개별 문자를 볼 수 있는 방법을 찾아야 합니다). 또한 현재 단어의 문자를 사전의 다른 단어와 비교하는 방법도 필요합니다(위의 두 번째 예처럼).

이 작업에 가장 적합한 도구는 무엇입니까?

답변1

다음 perl스크립트는 표준 입력 및/또는 명령줄에 나열된 파일 이름에서 단어 목록을 읽고 찾은 모든 회문과 되돌릴 수 있는 단어를 인쇄합니다. 3자 미만의 단어는 무시합니다(주로 내 /usr/share/dict/words파일에 "A" 및 "Aa"와 같은 쓰레기가 많기 때문입니다).

이것은 매우 간단한 Perl로 작성되었으며 "영리한" Perl 트릭을 사용하지 않고도 가능한 한 쉽게 이해하고 수정할 수 있도록 설계되었습니다.

#! /usr/bin/perl

use strict;

my %dict = ();

print "Palindromes\n";
print "-----------\n";

while(<>) {
   chomp;
   next if (length($_) < 3);

   $dict{$_} = 1;
   print "$_\n" if ($_ eq reverse($_));
}


print "\n\nReversibles\n";
print "-----------\n";
foreach my $key (keys %dict) {

    my $len = length($key);
    my $firsthalf = '';
    my $secondhalf = '';

    if (($len / 2) == int($len/2)) {
        # even length words
        $firsthalf = substr($key,0,int($len/2));
        $secondhalf = substr($key,int($len/2));
    } else {
        # odd length words
        $firsthalf = substr($key,0,int($len/2)+1);
        $secondhalf = substr($key,int($len/2)+1);
    };

    my $rev = $secondhalf . $firsthalf;

    next unless (exists $dict{$rev});

    # don't print if reversed word is a palindrome
    next if ($rev eq $key);

    print  "$key => $rev\n";
}

다음 출력을 생성합니다.

$ ./find-P-and-R.pl /usr/share/dict/words
Palindromes
-----------
MGM
aba
abba
aga
aha
aia
aka
...
...
...


Reversibles
-----------
mode => demo
reenter => terreen
juba => baju
oon => noo
lave => vela
lassi => silas
updo => doup
air => rai
...
...
...

답변2

정규식으로만 필터링해야 하는 경우에는 를 사용하세요 grep. 그러나 정규식 이상의 기능이 필요합니다. 익숙한 프로그래밍 언어를 사용할 수 있습니다. Awk는 모든 POSIX 시스템에 존재하며 파일을 한 줄씩 쉽게 처리할 수 있지만 프로그래밍 기능은 최고 수준이 아닙니다. Perl은 한 줄씩 쉽게 처리할 수 있으며 더 나은 문자열 처리 기능과 많은 라이브러리를 사용할 수 있습니다. Python은 배우기 쉽고 매우 유용한 라이브러리 세트를 갖추고 있습니다. 다른 많은 가능성이 있습니다.

회문을 확인하려면 *BSD 및 Linux에서 다음을 사용할 수 있습니다.rev파이프라인의 유틸리티. 파일의 모든 줄을 반대로 바꿉니다. 회문 찾기:

rev /usr/dict/words | paste /usr/dict/words - | sed -n 's/^\(.*\)\t\1$/\1/p'
perl -l -ne 'print if reverse($_) eq $_' /usr/dict/words

되돌릴 수 있는 단어 찾기:

rev /usr/dict/words | grep -Fxf /usr/dict/words
perl -l -ne '$dict{$_} = 1; END {foreach (keys %dict) {print if $dict{reverse($_)}}}'

답변3

sed 명령의 역참조 및 하위 표현식을 사용하여 많은 작업을 수행할 수 있습니다. 다음은 두 가지 예입니다.

예 1: 사전에서 중간에 o가 있는 3글자 회문 단어 찾기

  $ sed -E -n '/^(.)o\1$/p' /usr/share/dict/words
  bob
  mom
  non
  pop
  sos
  tot
  wow

예 2: 6글자 회문 단어 찾기

  $ sed -E -n '/^(.)(.)(.)\3\2\1$/p' /usr/share/dict/words
  redder

관련 정보