Цикл по строке (ключ, значение) с разделителем-Bash Scripting - PullRequest
0 голосов
/ 26 мая 2018

У меня есть значение, хранящееся в переменной типа

input="###key1,value1###key2,value2###key3,value3###"

Я хотел бы получить вывод, например

key1 has value1 values
key2 has value2 values
key3 has value3 values

Может кто-нибудь помочь мне, как добиться этого с помощью циклов в сценариях bash?

Спасибо,:)

и еще одно сомнение, что если

input="###key1, value1###key2, value2###key3,value3###

с пробелом перед значениями?Как это урезать?

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

С gnu sed

sed 's/##*/\n/g;s/^\n\|\n$//g;s/,/ has /g;s/\n\|$/ values&/g' <<<"$input"

  • s / ## * / \ n / g _________ замените каждый или несколько # на \ n
  • s / ^\ n \ | \ n $ // g _______ заменить пустую первую и последнюю строку на ничто
  • s /, / has / g _________ replace ',' на 'has'
  • s / \n \ | $ / values ​​& / g ___ заменить конец каждой строки на «значения»
0 голосов
/ 27 мая 2018

Вот способ использования цикла в bash.

lee:~/StackOverFlow $ cat test.sh 
input="$1"

input="$(echo "$input" | sed -E 's/^#+//; s/#+$//; s/#+/\\n/g;')"

echo -e "$input" | while read item; do
    k="$(echo $item | awk -F\, '{print $1}' | sed -E 's/^[[:space:]]+//')"
    v="$(echo $item | awk -F\, '{print $2}' | sed -E 's/^[[:space:]]+//')"
    echo "$k has $v values"
done

Вывод

lee:~/StackOverFlow $ bash test.sh "###key1,value1###key2,value2###key3,value3###"
key1 has value1 values
key2 has value2 values
key3 has value3 values
lee:~/StackOverFlow $ bash test.sh "###key1, value1###key2, value2###key3,value3###"
key1 has value1 values
key2 has value2 values
key3 has value3 values
  1. Удалить # начало и конец строки (-EИнтерпретировать регулярные выражения как расширенные)
  2. Заменить # на \n
  3. Использование while для чтения всей строки включает пробелы
  4. Разделить строку на пару ключ-значениеи удалите пробелы
0 голосов
/ 26 мая 2018

Вы можете использовать следующий подход (только для версий grep с флагом P):

#!/usr/bin/env bash                                                               

input="###key1,value1###key2,value2###key3,value3###"                            

eval $(grep -oP '[^#]*(?=###)' <<< $(echo "$input") | sed "s/,/=/")                

echo $key1                                                                      
echo $key2                                                                      
echo $key3

Вывод:

value1                                                                          
value2                                                                          
value3                                                                          

Во втором случае пробелы вокруг = необходимо удалить, поэтому вместо sed "s/,/=/" вам нужно sed "s/,/=/;s/ *//"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...