Número de novas linhas em uma string como inteiro [duplicado]

3

Eu quero encontrar o número de novas linhas em uma string e, em seguida, usar esse número em um loop while como limite.

Eu posso encontrar e escrever o número de linhas usando:

echo "$MY_STRING" | grep -c '$'

Para ter o número de linhas como inteiro e usá-lo no loop while eu faço isso:

MYNUM="$MY_PEERS" | grep -c '$'

No entanto, esta linha escreve 0, que não é o número de linhas na minha string, imediatamente no terminal. Além disso, não posso usar MYNUM em um loop while . (Eu uso $MYNUM no while ) Como posso obter o número de linhas para que eu possa usá-lo em um loop while como limite?

    
por Eric 12.03.2017 / 05:46

3 respostas

3

Embora eu não entenda completamente por que você precisa disso, essa é uma maneira de fazer isso. A chave é o $( ) para capturar a saída e atribuí-la a uma variável.

Código:

#!/usr/bin/env bash
IFS='' read -r -d '' TEST_STR <<-'EOF'
    Test text
    quick brown fox
    lazy dog
EOF

NEW_LINE_COUNT=$(echo "$TEST_STR" | wc -l)

echo "$TEST_STR"
echo "$NEW_LINE_COUNT"

Resultados:

Test text
quick brown fox
lazy dog

4
    
por 12.03.2017 / 06:04
2

Você não precisa contar linhas em sua string de múltiplas linhas para ver os dispositivos individuais. O for loop em conjunto com variáveis de array pode ser colocado aqui como:

IFS=$'\n' read -d '' -r -a Multi_Line_Str <<STR
    $(printf '%s\n' 'device_'{A..E})
STR

for device in "${Multi_Line_Str[@]}"
do
    echo "<$device>"
done
    
por 12.03.2017 / 09:05
2

Se você tiver uma sequência de várias linhas, pode simplesmente usar wc -l para contar o número de linhas:

printf '%s' "$string" | wc -l

Para armazenar esse número em uma variável:

nlines=$( printf '%s' "$string" | wc -l )

No entanto, você não precisa desse número para fazer um loop while:

printf '%s' "$string" |
while read -r line; do
   # do something with "$line"
done

Dependendo do que você está fazendo em cada linha, talvez você não precise de um loop while:

printf '%s' "$string" | awk '<some awk script>'

Dependendo de como os dados são gerados, você pode nem precisar armazená-los em uma variável de várias linhas:

some_command | some_line_by_line_processing

Aqui, some_command pode ser um loop while, uma coleção de comandos em um subshell ( (...) ) ou um comando simples que gera saída e some_line_by_line_processing também pode ser um comando simples (como awk ) ou um loop ou qualquer outra coisa que você precisa para processar a saída da primeira parte do pipeline linha por linha.

    
por 12.03.2017 / 09:08