안녕하세요 여러분, 약간의 운동을 도와주실 수 있는지 궁금합니다.
while
루프를 사용하여.bashrc
파일을 한 줄씩 읽고 숫자가 없는 줄 수를 계산합니다.
기본적으로 이것은 스크립트이지만 아무것도 알아낼 수 없는 것 같습니다. 도움이나 조언을 주시면 감사하겠습니다. 이런 경우에도 사용이 가능한지 알고 싶습니다 grep
.awk
내 시도:
cat .bashrc | while read line;
do if [ check_if_there_is_no_number_in $line ];
then increase_your_index>
fi done
스크립트 작성에 도움을 줄 수 있는 사람이 있나요? 미리 감사드립니다.
답변1
예, 다음을 grep
사용하여 이 작업을 수행할 수 있습니다.
grep -c -v '[[:digit:]]' ~/.bashrc
~/.bashrc
파일을 한 줄씩 읽습니다 . 행에 숫자가 포함되어 있으면("숫자"를 감지하기에 충분하다고 가정) 해당 숫자는 삭제됩니다. 나머지 행이 계산되고 숫자가 없는 총 행 수가 표시됩니다.
및 옵션에 대한 설명을 참조하세요 man grep
. 그러나 기본적으로 (행 자체가 아닌) 일치하는 행의 수를 반환하고 일치의 의미를 반전시켜 해당 행만 반환하도록 합니다.-c
-v
-c
grep
-v
아니요주어진 패턴과 일치하는 결과를 반환합니다.
이 패턴은 [[:digit:]]
숫자가 포함된 모든 줄과 일치합니다.
를 사용하면 awk
행 수를 직접 추적해야 합니다.
awk '!/[[:digit:]]/ { count++ } END { print count }' ~/.bashrc
여기서 !
현재 행의 숫자 앞에 오는 테스트는 테스트의 의미를 반전시킵니다. 행이 성공적으로 테스트되면 이 변수가 count
증가됩니다. END
더 이상 읽을 행이 없을 때 이 블록이 실행되고 현재 값이 출력됩니다 count
.
다음과 같은 파일이 발생할 것으로 예상되는 경우 이 스크립트를 개선해야 합니다.아니요숫자가 없는 행 count
(예:비어 있는(아니요 0
). 예를 들어 블록을 사용하거나 BEGIN { count = 0 }
with 문에서 산술 평가를 강제하여 수행할 수 있습니다 .print
print 0+count
"를 읽고 이해했다고 가정합니다.쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?" 그리고""IFS=read-r-line" 이해", 교사의 요구 사항을 충족하기 위해 /bin/sh
다음 스크립트를 사용할 수 있습니다.
#!/bin/sh
count=0
while IFS= read -r line; do
case $line in
*[[:digit:]]*)
;;
*)
count=$(( count + 1 ))
esac
done < ~/.bashrc
printf 'There are %d lines with no digit\n' "$count"
또는 bash
,
#!/bin/bash
count=0
while IFS= read -r line; do
[[ $line != *[[:digit:]]* ]] && count=$(( count + 1 ))
done < ~/.bashrc
printf 'There are %d lines with no digit\n' "$count"
grep
및 awk
솔루션은 정규식 일치를 사용 하지만 여기에 표시된 두 루프는 "와일드카드 패턴"을 사용하여 숫자를 일치시킵니다.
개인적으로는 더 간단한 솔루션을 선택하겠습니다 grep
. 동일한 기능이 내장되어 있으면 불필요하기 while
때문에 프로덕션 코드에서 위 루프를 "수정" 하지 않을 것입니다 . grep
게다가 나는 글을 작성할 때 두 가지 오타와 누락을 수정해야 했는데, 이는 엉성한 프로그래머가 단순한 해결책보다 더 많은 실수를 할 수 있다는 것을 의미합니다 grep
.