문자열에서 특정 문자의 발생 횟수를 계산하는 방법

문자열에서 특정 문자의 발생 횟수를 계산하는 방법

주요 문제:

파일 시스템의 루트를 기준으로 경로 깊이를 결정하는 스크립트를 작성하십시오. 경로는 명령줄에서 인수로 수신됩니다. 인수가 수신되지 않으면 현재 작업 디렉터리가 경로로 처리됩니다. 인수가 유효한 경로가 아닌 경우 오류 메시지가 stderr에 인쇄되고 0이 아닌 종료 상태가 반환됩니다. 다른 오류 조건(예: 지정된 경로를 읽을 수 있는 권한 부족)도 비슷한 방식으로 처리해야 합니다. 성공하면 스크립트는 표준 출력에 깊이를 인쇄하고 0을 반환해야 합니다.

오류 사례를 처리하는 방법을 알고 있지만 주요 문제는 경로의 깊이를 찾는 것입니다. 주어진 경로를 문자열로 저장하고 "/" 유령의 수를 세어볼까 생각 중입니다. 다음 명령을 사용하여 이 작업을 수행할 수 있다는 것을 알았습니다.

grep -o "/" $PWD | wc -l

하지만 여러 디렉토리를 변경해도 1이 표시됩니다. 저는 아직 쉘 스크립팅을 배우는 중입니다. 자세한 해결책을 알려주실 수 있나요?

답변1

grep -o "/" $PWDPWD읽을 파일의 이름으로 사용됩니다 . 많은 시스템에서 파일은 물론 디렉터리도 읽을 수 없기 때문에 오류가 발생하는 것처럼 보입니다. (일부 시스템을 제외하면 여전히 가능하지만 여기서는 내용이 그다지 유용하지 않습니다.)

대신 printf "%s\n" "$PWD" | grep -o / | wc -lksh/Bash/zsh/yash에서 내장된 대체 연산자를 사용하여 슬래시를 제외한 모든 항목을 제거한 다음 문자 수를 계산할 수 있습니다.s=$PWD; s=${s//[^\/]}; num=${#s}

를 사용하면 zsh로 단축할 수 있습니다 num=${#PWD//[^\/]}.

또는 표준 도구를 사용하십시오: printf %s "$PWD" | LC_ALL=C tr -dc / | wc -c.

답변2

게시물()의 명령은 경로를 구성하는 문자열이 아닌 grep -o "/" $PWD | wc -lgrep을 대상으로 사용하려고 시도합니다 .$PWD

원하는 효과를 얻으려면 다음을 수행하십시오 echo $PWD | grep -o "/" | wc -l.

대안으로 목표는 경로의 깊이를 찾는 것이므로 슬래시 수 대신 경로에 있는 디렉터리 수를 계산할 수 있습니다.

예를 들어:

echo "$PWD" | tr " /" "- " | wc -w

tr모든 공백을 "-" 문자로 변환하고 모든 "/"를 공백으로 변환합니다. wc -w그런 다음 이전 출력의 단어 수를 셉니다. 이렇게 하면 이름에 공백이 포함되어 있더라도 각 디렉터리는 한 단어로만 계산됩니다. 또한 "/" 개수를 계산하지 않으므로 루트 디렉터리의 깊이를 확인하면 깊이가 0으로 표시됩니다.

  • 예시 1: $ pwd /tmp/test directory $ echo "$PWD" | tr " /" "- " | wc -w 2

  • 예 2: $ pwd / $ echo "$PWD" | tr " /" "- " | wc -w 0

답변3

grep -o "/" <<< "$PWD" | wc -l

작업 디렉터리를 다시 grep으로 리디렉션한 다음 줄 수를 인쇄해야 합니다.

답변4

경로의 "/" 수를 계산하려면 다음 명령을 사용하십시오. 테스트 후 효과는 매우 좋습니다

주문하다

echo "$PWD" | awk '{print  gsub("/","",$0)}'

산출

@praveen t1]#

 pwd
/tmp/p1/t1

[루트@praveen t1]#echo "$PWD" | awk '{print gsub("/","",$0)}'

3

[루트@praveen

관련 정보