grep, Pipe 및 Cat을 사용하여 혼합 영숫자 입력 출력

grep, Pipe 및 Cat을 사용하여 혼합 영숫자 입력 출력

입력으로 혼합 단어 목록이 있습니다.

azert12345
a1z2e3r4t5
a1z2e3r455

실행하려는 명령줄은 다음과 같습니다.

cat file.txt | grep -E "[[:digit:]]{5}" --color

내가 이루고 싶은 것:

grep이전에 말한 패턴을 사용하여 "azert12345" 및 "a1z2e3r4t5"라는 단어만 인쇄합니다 . 그것은 마치 grep -E "[[:digit:]]{5}".

grep -E "[[:alpha:]]{5}[[:digit:]]{5}"최대 자릿수 5, 최대 알파벳 문자 수 5를 사용하여 "azert12345"와 같은 단어를 인쇄하는 것은 쉽지만, 문제는 다음과 같습니다. a1z2e3r4t5와 같은 혼합 단어를 어떻게 인쇄합니까?

"a1z2e3r4t5"는 예시일 뿐이고, 처리해야 할 데이터의 양은 훨씬 더 많습니다.

이 문제는 나를 3일 동안 미치게 만들었고 그것은 숙제가 아니었습니다. 리눅스 명령어에 대해 다시 배워보겠습니다. 나는 도움이 필요해.

답변1

IMHO 이것은 다음과 같은 이유로 awk 또는 perl에서 더 간단합니다.grep 및 논리 연산자(특히 grep에는 자연 연산자가 없습니다 AND). 예를 들어

awk 'gsub(/[a-z]/,"&") == 5 && gsub(/[0-9]/,"&") == 5' file

또는

perl -ne 'print if tr/[a-z]// == 5 && tr/[0-9]// == 5' file

각 문자 세트의 정확히 5자를 포함하는 행이 인쇄됩니다.


grep 사용을 고집한다면 다음과 같이 작동할 수 있습니다.

grep -xE '([^a-z]*[a-z][^a-z]*){5}' file | grep -xE '([^0-9]*[0-9][^0-9]*){5}'

답변2

사용하지 마세요올바른 도구,바라보다, 그러나 적어도 대안으로:

while read i; do 
  foo=$(echo -n $i | sed 's/[a-z]//g' | wc -c) && bar=$(echo -n $i | sed 's/[0-9]//g' | wc -c)
  [[ $foo -eq 5 && $bar -eq 5 ]] && echo "$i  has five digits and five alphas" 
done < file

문자를 제거하고 남는 것은 숫자입니다. 철저하게 하려면 숫자를 제거하고 남은 것은 문자뿐입니다. 각 결과를 변수에 저장합니다.

foo=$(echo -n $i | sed 's/[a-z]//g' | wc -c) && bar=$(echo -n $i | sed 's/[0-9]//g' | wc -c)

변수 길이가 5자인 경우 문자열은 숫자 5개와 문자 5개입니다.

[[ $foo -eq 5 && $bar -eq 5 ]] && echo "$i  has five digits and five alphas" 

산출:

azert12345  has five digits and five alphas
a1z2e3r4t5  has five digits and five alphas

이 논리에 문제가 있나요?

관련 정보