입력으로 혼합 단어 목록이 있습니다.
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
이 논리에 문제가 있나요?