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
각 줄에 8개의 소문자 16진수 숫자가 포함된 줄 스트림을 얻으려면 다음을 사용할 수 있습니다.
tr -c -d '0-9a-f' </dev/random | fold -w 8
이는 /dev/random
관심이 없는 문자를 읽고 제거합니다 tr
. fold
그런 다음 스트림을 8개의 문자 줄로 자르는 데 사용됩니다.
tr
다른 문자 집합을 선택하려면 선택 표현식을 수정하세요 . fold
더 길거나 더 짧은 문자열을 얻으려면 길이를 수정하십시오 . grep
생성된 문자열에서 다른 기준을 충족하는 문자열을 선택하려면 파이프라인에 단계를 추가합니다(예: grep 111
3개의 연속 허용만 사용) 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에서도 사용할 수 있습니다.
$RANDOM
15자리 의사 난수입니다. 최신 버전에는 더 무작위적인 32비트 정수도 bash
있으므로 다음 중 선호할 수 있습니다.$SRANDOM
for ((i=0;i<10;i++)) {
printf "%08x\n" "$SRANDOM"
}
이제 귀하의 질문에 대한보다 직접적인 대답으로 간단한 정규식의 경우 다음을 사용할 수 있습니다.String::Random
모듈 perl
( libstring-random-perl
Debian 기반 배포판용 패키지):
$ 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
(문서에 명시된 바와 같이 이것은 그렇지 않습니다.실제 정규 표현식; 임의의 정규 표현식을 사용하여 이를 수행하는 것은 매우 어렵고 특별히 유용하지 않습니다.