특정 길이의 모든 문자열을 구문 분석하시겠습니까?

특정 길이의 모든 문자열을 구문 분석하시겠습니까?

10년 된 이메일 아카이브를 내보냈는데 용량이 꽤 큽니다.

비트코인 개인 키를 검색하기 위해 64자 길이의 문자열의 모든 텍스트를 구문 분석하고 싶습니다.

특정 길이의 문자열을 구문 분석하는 방법은 무엇입니까?

답변1

0-916진수 형식의 256비트 숫자(범위 내 64자 - 비트코인 ​​개인 키에 가능한 형식 중 하나) 를 검색하려는 경우 A-F다음을 수행해야 합니다.

egrep -aro '\<[A-F0-9]{64}\>' files and dirs ...

옵션을 추가하거나 일부 키가 소문자인 경우 -i범위도 포함합니다 .a-f

동일한 클래스에서 지정된 길이의 문자열을 찾는 일반적인 문제의 경우 옵션과 함께 GNU grep과 함께 사용할 수 있는 pcre regexps를 사용하는 것이 더 좋습니다 -P. 예를 들어, 최소 길이가 2이고 최대 길이가 4이고 대문자 이외의 문자로 구분된 문자 집합에서 대문자를 찾으려면 다음을 수행합니다.

echo ÁRVÍZtűrő tükörFÚRÓgép |
   LC_CTYPE=en_US.UTF-8 grep -Po '(?<!\p{Lu})\p{Lu}{2,4}(?!\p{Lu})'
FÚRÓ

소문자, 공백이 아닌 문자 등 \p{Lu}으로 대체합니다 . 보다\p{Ll}\S여기그리고여기전체 목록을 확인하세요.

(?<!...)그리고 (?!...)부정적인뒤를 돌아보고 앞을 보아라너비가 0예를 들어 (?<!<)\w(?!>)and로 묶이지 않은 경우 "단어" 문자가 일치됩니다. 너비가 0인 어설션은 를 통해 구현할 수 있습니다.<>\<vi(?<!\w)(?=\w)

답변2

길이가 64인 모든 단어를 찾으려면 다음을 /path/to/file사용할 수 있습니다.

tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'

이렇게 하면 영숫자가 아닌 모든 문자가 개행 문자로 바뀌므로 각 단어가 한 줄에 표시됩니다. 그런 다음 이 결과를 필터링하여 길이가 64인 단어만 포함합니다.

답변3

GNU(Linux의 기본값)가 있는 경우 grep다음을 수행할 수 있습니다.

grep -Po '(^|\s)\S{64}(\s|$)' file

(단어 경계) (공백이 아닌) 및 (정확히 N 문자 찾기)를 제공하고 "줄에서 일치하는 부분만 인쇄"하는 것을 의미하는 -PPerl 호환 정규식을 활성화합니다 . 그런 다음 non-의 확장자를 찾습니다. 공백은 정확히 64자 길이이며, 줄 시작 부분( )이나 공백( ) 뒤에 있고, 줄 끝( )에 있거나 다른 공백 문자로 끝납니다.\b\S{N}-o^'s$

결과에는 문자열의 시작과 끝 부분에 공백 문자가 포함되므로 더 자세히 구문 분석하려면 다음을 사용할 수 있습니다.

grep -Po '(^|\s)\K\S{64}(?=\s|$)'

이것은 공백 문자 또는 문자열의 시작 부분을 찾은 (\s|^)다음 이를 버리고 \K공백이 아닌 64개의 문자를 찾은 다음 ( (?=foo)"라고 함)시야"이며 일치 항목에는 공백 문자 또는 줄 끝이 포함되지 않습니다.

답변4

grep은 문자열을 "검색"하는 데 적합한 도구인 것 같습니다. 이제 남은 일은 정규식을 사용하여 이러한 문자열을 정의하는 것입니다. 첫 번째 문제는 단어의 범위를 정의하는 것입니다. a book, a lamp단어 구분 기호 로 사용되는 "공백"만큼 간단하지는 않습니다. ,동일한 개념에서 다른 많은 문자, 심지어 줄의 시작이나 끝도 단어 구분 기호 역할을 할 수 있습니다. GNU grep에는 몇 가지 단어 구분 기호가 있습니다:

  • \<말이 시작됩니다.
  • \>단어 끝.
  • \b단어 경계.

그들은 모두 단어가 [a-zA-Z0-9_]일련의 문자라고 가정합니다. 괜찮다면 다음 정규 표현식이 작동합니다.

 grep -o '\<.\{64\}\>' file

확장 정규식을 사용할 수 있으면 다음을 \줄일 수 있습니다.

 grep -oE '\<.{64}\>' file

단어 시작( \<), 64( {64})자( .) ~ 단어 끝( \>) 중에서 선택하고 일치하는 -o부분( )만 인쇄합니다.

그러나 dot( .)는 일치합니다.어느성격이 너무 많을 수도 있습니다.

보다 엄격하게(16진수) 선택하려면 다음을 사용하십시오.

 grep -oE '\<[0-9a-fA-F]{64}\>' file

이렇게 하면 소문자 16진수를 사용할 수 있습니다.또는수도. 그러나 일부 비ASCII 문자가 포함될 수 있으므로 엄격하게 적용하려면 다음을 사용하세요.

 LC_ALL=C grep -oE '\<[0-9a-fA-F]{64}\>' file

\<grep -P와 같은 일부 grep 구현에는 "단어 시작" 또는 "단어 끝"( 및 과 같은)이 없지만 \>"단어 경계"( 와 같은 \b)는 있습니다.

grep -oP '\b[0-9a-fA-F]{64}\b' file

몇 가지 언어가 있어요POSIX 단어 경계를 허용 [[:<:]]하지만 [[:>:]]Perl은 허용하지 않으며 PCRE 8.34에서만 허용합니다..

그리고"단어 경계"에도 다양한 스타일이 있습니다..

관련 정보