Como contar o número de aparições de um caractere em uma string

0

O principal problema:

Write a script that determines a path's depth relative to the filesystem's root. The path is received as an argument on the command line. If no argument is received, the current working directory is considered as the path. If the argument is not a valid path, then an error message is printed to stderr and a non-zero exit status is returned. Other error conditions, such as insufficient permissions to read the given path should be treated in a similar manner. If successful, the script should print the depth to stdout and return 0.

Eu sei como lidar com os casos de erro, mas meu principal problema é encontrar a profundidade do caminho. Eu estava pensando em salvar o caminho dado como uma string e contar o número de aparições '/'. Eu vi que posso fazer isso usando este comando:

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

Mas isso exibe 1 mesmo se eu alterar vários diretórios. Eu ainda estou aprendendo sobre shell scripts, então você pode me dar detalhes sobre as soluções?

    
por Vlad Dragomir 26.01.2018 / 14:55

4 respostas

0

O comando em sua postagem ( grep -o "/" $PWD | wc -l ) tentará usar o $PWD como um destino, em vez da sequência de caracteres que compõe esse caminho.

Para alcançar o efeito pretendido, você pode fazer echo $PWD | grep -o "/" | wc -l .

Como alternativa, como o objetivo é encontrar a profundidade do caminho, você pode contar o número de diretórios nesse caminho em vez do número de barras.

Por exemplo:

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

tr traduz todos os espaços para o caractere "-" e todos os "/" para espaços. wc -w , em seguida, conta o número de palavras na saída anterior. Isso garante que cada diretório conte apenas como uma palavra, mesmo que contenham espaços em seus nomes. Além disso, como não estamos contando o número de "/", verificar sua profundidade no diretório raiz indicará uma profundidade de 0.

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

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

por 26.01.2018 / 16:19
1

grep -o "/" $PWD usaria o conteúdo de PWD como o nome de um arquivo para ler. Parece que isso deve lhe dar um erro, pois em muitos sistemas, você não pode ler um diretório como se fosse um arquivo. (Exceto, talvez, em alguns sistemas, você ainda pode, mas o conteúdo não será muito útil aqui.)

Em vez disso, use printf "%s\n" "$PWD" | grep -o / | wc -l . Em ksh / Bash / zsh / yash, você poderia usar o operador de substituição embutido para remover qualquer coisa, exceto as barras, e então calcular a contagem de caracteres: s=$PWD; s=${s//[^\/]}; num=${#s}

Com zsh , você pode reduzi-lo para num=${#PWD//[^\/]} .

Ou usando ferramentas padrão: printf %s "$PWD" | LC_ALL=C tr -dc / | wc -c .

    
por 26.01.2018 / 15:29
0
grep -o "/" <<< "$PWD" | wc -l

Você precisa redirecionar seu diretório de trabalho de volta para o grep e depois imprimir o número de linhas.

    
por 26.01.2018 / 15:18
0

Para contar o número de "/" no caminho Basta usar o comando abaixo. Como Testado funcionou bem

comando

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

saída

@praveen t1] #

 pwd
/tmp/p1/t1

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

3

[root @ praveen

    
por 26.01.2018 / 15:53

Tags