Bash의 정규식에서 문자열 생성

Bash의 정규식에서 문자열 생성

Bash에서 정규 표현식으로 제공되는 문자열을 생성하고 파이프하는 방법다른 명령으로?

예를 들어:

> $RANDOM | regex "{abcdef\d}[8]" | grep "1{3}" | less

기반으로 할 수있는 유틸리티를 찾지 못했습니다.정규식 특수

정규식이 입력됩니다. 정규식을 기반으로 문자열을 생성하는 유틸리티를 찾고 싶습니다.

예를 들어:

$ regex "{abcdef\d}[8]" -n 10
b8789a62
97303666
8b536c28
79590607
6d80ad60
78d36ded
aa001d9a
8826f276
df1e1f7a
854307db

두 가지 제한사항:

  1. 반복 연산자가 주어진 텍스트를 생성하도록 허용된 횟수는 일부 내부(보이지 않는) 숫자에 의해 제한됩니다.
  2. 생성되는 문자열의 수는 사용자가 지정한 수에 따라 제한됩니다.

답변1

각 줄에 8개의 소문자 16진수 숫자가 포함된 줄 스트림을 얻으려면 다음을 사용할 수 있습니다.

tr -c -d '0-9a-f' </dev/random | fold -w 8

이는 /dev/random관심이 없는 문자를 읽고 제거합니다 tr. fold그런 다음 스트림을 8개의 문자 줄로 자르는 데 사용됩니다.

tr다른 문자 집합을 선택하려면 선택 표현식을 수정하세요 . fold더 길거나 더 짧은 문자열을 얻으려면 길이를 수정하십시오 . grep생성된 문자열에서 다른 기준을 충족하는 문자열을 선택하려면 파이프라인에 단계를 추가합니다(예: grep 1113개의 연속 허용만 사용) 1.

답변2

임의의 32자리 16진수를 인쇄하는 구체적인 예를 보려면 다음을 od사용할 수도 있습니다 .hexdump/dev/urandom

$ od -w4 -An -vtx4 -N40 /dev/urandom
 f0c37f96
 e5dc1143
 ebc9cd59
 7fe573da
 3622c662
 e7bc0013
 5f9e2017
 79a6ccff
 4dd1d41d
 a6957940
$ hexdump -e '"%08x\n"' -n40 /dev/urandom
9f739176
e13a816f
0860c351
42bf86e7
c810ab07
1f42e7b9
d76b7016
10d2ac2c
b5ae6ca5
28089547

또는 귀하의 의견에서 bash 내장 기능을 언급했기 때문에:

for ((i=0;i<10;i++)) {
  printf "%08x\n" "$((RANDOM<<17^RANDOM<<2^RANDOM))"
}

(구문은 실제로 ksh에서 유래했으며(ksh에는 원래 내장되어 있지 않았지만 printf) zsh 및 bash에서도 사용할 수 있습니다.

$RANDOM15자리 의사 난수입니다. 최신 버전에는 더 무작위적인 32비트 정수도 bash있으므로 다음 중 선호할 수 있습니다.$SRANDOM

for ((i=0;i<10;i++)) {
  printf "%08x\n" "$SRANDOM"
}

이제 귀하의 질문에 대한보다 직접적인 대답으로 간단한 정규식의 경우 다음을 사용할 수 있습니다.String::Random모듈 perl( libstring-random-perlDebian 기반 배포판용 패키지):

$ perl -MString::Random=random_regex -le 'print random_regex("[0-9a-f]{8}") for 1..10'
e785f800
264a131c
c7bcb74e
26d6c169
d5e169df
210ac1c0
616e651d
badf8131
50c15bb5
93e2b2a5

(문서에 명시된 바와 같이 이것은 그렇지 않습니다.실제 정규 표현식; 임의의 정규 표현식을 사용하여 이를 수행하는 것은 매우 어렵고 특별히 유용하지 않습니다.

관련 정보