Попытка вашего кода
Я попробовал вашу команду и получу это как вывод:
$kw_var1
$kw_var2
$kw_var3
$kw_var4
$kw_var5
Вы получили неправильный вывод, потому что вы выбрали первое поле, когда выиспользовал cut
вместо второго.
Команда фиксации обрезки
for param in $(cat test.txt | grep "kw\_"); do echo $(echo '$'$param | cut -s -d '=' -f2); done
Возвраты:
'string1'
'string
'this
'does
'maybe'
Крепление IFS
Вы использовали цикл for in
, но он не перебирает символы новой строки, он перебирает пробелы.Сначала необходимо изменить переменную IFS (Разделитель внутренних полей):
IFS=$'\n'; for param in $(cat <file> | grep "kw\_"); do echo $(echo $param | cut -s -d '=' -f2); done
Вывод:
'string1'
'string 2'
'this is string 3'
'does not matter'
'maybe'
Использование printf
Чтобы получить вывод в одну строку, вы можете использовать printf
вместо echo
:
for param in $(cat <file> | grep "kw\_"); do printf "$(echo $param | cut -s -d '=' -f2) "; done; printf "\n"
Выход:
'string1' 'string 2' 'this is string 3' 'does not matter' 'maybe'
Использование while
Вы можете упростить команду и использовать оператор while read
, который выполняет итерацию непосредственно по строкам:
cat <file> | grep "kw\_" | cut -d"=" -f2 | while read line; do printf "${line} "; done; printf "\n"
Использование awk
И последнее, но не менее важное: вы можете использовать awk, который значительно упрощает ваш код:
awk -F"=" '/kw_/{printf "%s ", $2}END{print ""}' <file>
Вывод:
'string1' 'string 2' 'this is string 3' 'does not matter' 'maybe'
Если лишний пробел в конце строки раздражает,Вы можете сделать это:
awk -F"=" '/kw_/{printf "%s%s", delim, $2; delim=" "}END{print ""}' <file>
Awk объяснил:
# Using = as delimiter
awk -F"=" '
# If line contains kw_
/kw_/{
# Prints second field
printf "%s%s", delim, $2;
delim=" "
}
END{
# Prints newline
print ""
}' <file>
Окончательный код
list_of_values=$(awk -F"=" '/kw_/{printf "%s%s", delim, $2; delim=" "}END{print ""}' $file.env)